题意和hdu 3308 几乎一样
维护一个lmax ,rmax,mmax代表左 中 右 区间最长lcis长度
不过是区间加操作
那就直接写就行了
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <stack>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <sstream>
using namespace std;
const int MAX_N = 100024;
int lnum[MAX_N<<2],rnum[MAX_N<<2],lmax[MAX_N<<2],rmax[MAX_N<<2],mmax[MAX_N<<2],col[MAX_N<<2];
void up(int rt,int l,int r){
int mid = (l+r)>>1;
lnum[rt] = lnum[rt<<1];
rnum[rt] = rnum[rt<<1|1];
lmax[rt] = lmax[rt<<1];
rmax[rt] = rmax[rt<<1|1];
mmax[rt] = max(mmax[rt<<1],mmax[rt<<1|1]);
if(lnum[rt<<1|1]>rnum[rt<<1]){
mmax[rt] = max(mmax[rt],lmax[rt<<1|1]+rmax[rt<<1]);
if(lmax[rt<<1]==mid-l+1)
lmax[rt] += lmax[rt<<1|1];
if(rmax[rt<<1|1]==r-mid)
rmax[rt] += rmax[rt<<1];
}
}
void down(int rt,int l,int r){
if(col[rt]){
col[rt<<1] += col[rt];
col[rt<<1|1] += col[rt];
lnum[rt<<1] += col[rt];
lnum[rt<<1|1] += col[rt];
rnum[rt<<1] += col[rt];
rnum[rt<<1|1] += col[rt];
col[rt] = 0;
}
}
void build(int rt,int l,int r){
col[rt] = 0;
if(l==r){
scanf("%d",&lnum[rt]);
rnum[rt] = lnum[rt];
lmax[rt] = rmax[rt] = mmax[rt] = 1;
return ;
}
int mid = (l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
up(rt,l,r);
}
void modify(int rt,int l,int r,int x,int y,int v){
if(x<=l&&r<=y){
col[rt] += v;
lnum[rt] += v;
rnum[rt] += v;
return ;
}
int mid = (l+r)>>1;
down(rt,l,r);
if(x<=mid) modify(rt<<1,l,mid,x,y,v);
if(mid<y) modify(rt<<1|1,mid+1,r,x,y,v);
up(rt,l,r);
}
int query(int rt,int l,int r,int x,int y){
if(x<=l&&r<=y){
return mmax[rt];
}
int mid = (l+r)>>1;
down(rt,l,r);
int maxx1 = 0,maxx2 = 0,maxx3 = 0;
if(x<=mid) maxx1 = query(rt<<1,l,mid,x,y);
if(mid<y) maxx2 = query(rt<<1|1,mid+1,r,x,y);
if(x<=mid&&mid<y&&lnum[rt<<1|1]>rnum[rt<<1]) maxx3 = min(mid-x+1,rmax[rt<<1])+min(y-mid,lmax[rt<<1|1]);
return max(max(maxx1,maxx2),maxx3);
}
int main(){
int t;
scanf("%d",&t);
int Case = 0;
while(t--){
printf("Case #%d:\n",++Case);
int n,m;
scanf("%d%d",&n,&m);
build(1,1,n);
char str[5];
int a,b,c;
while(m--){
scanf("%s",str);
if(str[0]=='a'){
scanf("%d%d%d",&a,&b,&c);
modify(1,1,n,a,b,c);
}
else {
scanf("%d%d",&a,&b);
printf("%d\n",query(1,1,n,a,b));
}
}
}
return 0;
}