线段树的题目~~
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
const int MAXN = 100010;
int max_len[MAXN<<2], lcis[MAXN<<2], rcis[MAXN<<2], lleft[MAXN<<2], rright[MAXN<<2], addv[MAXN<<2], val[MAXN];
void PushUp(int rt, int l, int r)
{
int m = (l + r)>>1;
lleft[rt] = lleft[rt<<1]; rright[rt] = rright[rt<<1|1];
max_len[rt] = max(max_len[rt<<1], max_len[rt<<1|1]);
if(rright[rt<<1] < lleft[rt<<1|1])
max_len[rt] = max(max_len[rt], lcis[rt<<1|1] - rcis[rt<<1] + 1);
lcis[rt] = lcis[rt<<1]; rcis[rt] = rcis[rt<<1|1];
if(lcis[rt<<1] == m && rright[rt<<1] < lleft[rt<<1|1])
{
lcis[rt] = lcis[rt<<1|1];
}
if(rcis[rt<<1|1] == m + 1 && rright[rt<<1] < lleft[rt<<1|1])
{
rcis[rt] = rcis[rt<<1];
}
}
void PushDown(int rt)
{
if(addv[rt])
{
addv[rt<<1] += addv[rt];
addv[rt<<1|1] += addv[rt];
lleft[rt<<1] += addv[rt];
rright[rt<<1] += addv[rt];
lleft[rt<<1|1] += addv[rt];
rright[rt<<1|1] += addv[rt];
addv[rt] = 0;
}
return ;
}
void Bulid(int l, int r, int rt)
{
addv[rt] = 0;
if(l == r)
{
max_len[rt] = 1;
lcis[rt] = rcis[rt] = l;
lleft[rt] = rright[rt] = val[l];
return ;
}
int m = (l + r)>>1;
Bulid(l, m, rt<<1);
Bulid(m + 1, r, rt<<1|1);
PushUp(rt, l, r);
return ;
}
void Update(int L, int R, int v, int l, int r, int rt)
{
if(L == l && R == r)
{
addv[rt] += v;
lleft[rt] += v;
rright[rt] += v;
return ;
}
PushDown(rt);
int m = (l + r)>>1;
if(R <= m)
Update(L, R, v, l, m, rt<<1);
else if(L > m)
Update(L, R, v, m + 1, r, rt<<1|1);
else
{
Update(L, m, v, l, m, rt<<1);
Update(m + 1, R, v, m + 1, r, rt<<1|1);
}
PushUp(rt, l, r);
return ;
}
int Query(int L, int R, int l, int r, int rt)
{
if(L == l && R == r)
{
return max_len[rt];
}
PushDown(rt);
int m = (l + r)>>1;
if(R <= m)
return Query(L, R, l, m, rt<<1);
else if(L > m)
return Query(L, R, m + 1, r, rt<<1|1);
else
{
int ans = 0;
ans = max(ans, Query(L, m, l, m, rt<<1));
ans = max(ans, Query(m + 1, R, m + 1, r, rt<<1|1));
if(lleft[rt<<1|1] > rright[rt<<1])
{
int cntl = min(m - L + 1, m - rcis[rt<<1] + 1);
int cntr = min(R - m, lcis[rt<<1|1] - m);
ans = max(ans, cntl + cntr);
}
return ans;
}
}
int main()
{
//freopen("aa.in", "r", stdin);
int T, kcase = 0, n, q; char op[2]; int a, b, c;
scanf("%d", &T);
while(T--)
{
kcase++;
scanf("%d %d", &n, &q);
for(int i = 1; i <= n; ++i)
{
scanf("%d", &val[i]);
}
Bulid(1, n, 1);
printf("Case #%d:\n", kcase);
while(q--)
{
scanf("%s", op);
if(op[0] == 'q')
{
scanf("%d %d", &a, &b);
printf("%d\n", Query(a, b, 1, n, 1));
}
if(op[0] == 'a')
{
scanf("%d %d %d", &a, &b, &c);
Update(a, b, c, 1, n, 1);
}
}
}
return 0;
}