#include <bits/stdc++.h>
using namespace std;
#define MXN 100010
int n, m, d[MXN];
struct sTN{int l, r, mid, lm, m, rm;} tree[MXN<<2];
void up(int root){
sTN & rt = tree[root];
sTN & lrt = tree[root<<1];
sTN & rrt = tree[root<<1|1];
rt.m = max(lrt.m, rrt.m);
rt.lm = lrt.lm, rt.rm = rrt.rm;
if(d[lrt.r] < d[rrt.l]){
rt.m = max(rt.m, lrt.rm + rrt.lm);
if(lrt.lm == lrt.r - lrt.l+1)
rt.lm = lrt.lm + rrt.lm;
if(rrt.rm == rrt.r - rrt.l+1)
rt.rm = lrt.rm + rrt.rm;
}
}
void build(int root, int l, int r){
sTN & rt = tree[root];
int mid = (l+r)/2;
rt.l = l, rt.r = r, rt.mid = mid;
if(l == r){
rt.lm = 1, rt.m = 1, rt.rm = 1;
return;
}
build(root<<1, l, mid);
build(root<<1|1, mid+1, r);
up(root);
}
void update(int root, int a, int b){
sTN & rt = tree[root];
if(rt.l == rt.r) d[a] = b;
else{
if(a > rt.mid) update(root<<1|1, a, b);
else update(root<<1, a, b);
up(root);
}
}
int query(int root, int l, int r){
sTN & rt = tree[root];
if(rt.l == l && rt.r == r) return rt.m;
sTN & lrt = tree[root<<1];
sTN & rrt = tree[root<<1|1];
if(rt.mid < l)
return query(root<<1|1, l, r);
else if(rt.mid >= r)
return query(root<<1, l, r);
else{
int mx = max(query(root<<1, l, rt.mid), query(root<<1|1, rt.mid+1, r));
if(d[lrt.r] < d[rrt.l]){
return max(min(lrt.rm,rt.mid-l+1)+min(rrt.lm, r-rt.mid), mx);
}
return mx;
}
}
int main(){
int T, a, b;
char op[10];
scanf("%d", &T);
while(T--){
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", d+i);
build(1, 1, n);
while(m--){
scanf("%s %d %d", op, &a, &b);
if(op[0] == 'U') update(1, a+1, b);
else printf("%d\n", query(1, a+1, b+1));
}
}
return 0;
}
hdu 3308 LCIS(线段树)
最新推荐文章于 2024-02-08 22:18:43 发布