#include<iostream>
#include<cstdio>
using namespace std;
#define lrt (rt<<1)
#define rrt (rt<<1|1)
#define mid ((l+r)>>1)
#define lson l,mid,lrt
#define rson mid+1,r,rrt
#define llen mid-l+1
#define rlen r-mid
const int maxn=100010;
struct SegTree
{
int arr[maxn];
int lsum[maxn<<2],rsum[maxn<<2],sum[maxn<<2];
inline int min(int a,int b)
{
return a<b?a:b;
}
inline int max(int a,int b,int c=0)
{
b=b>c?b:c;
return a>b?a:b;
}
void pushup(int l,int r,int rt)
{
lsum[rt]=lsum[lrt];
rsum[rt]=rsum[rrt];
if(arr[mid]>=arr[mid+1])
{
sum[rt]=max(sum[lrt],sum[rrt]);
return;
}
if(lsum[lrt]==llen) lsum[rt]+=lsum[rrt];
if(rsum[rrt]==rlen) rsum[rt]+=rsum[lrt];
sum[rt]=max(sum[lrt],sum[rrt],rsum[lrt]+lsum[rrt]);
}
void build(int l,int r,int rt)
{
if(l==r)
{
lsum[rt]=rsum[rt]=sum[rt]=1;
return;
}
build(lson);
build(rson);
pushup(l,r,rt);
}
void update(int k,int v,int l,int r,int rt)
{
if(l==r)
{
arr[l]=v;return;
}
if(k<=mid) update(k,v,lson);
else update(k,v,rson);
pushup(l,r,rt);
}
int query(int s,int t,int l,int r,int rt)
{
if(s<=l&&t>=r) return sum[rt];
if(t<=mid) return query(s,t,lson);
if(s> mid) return query(s,t,rson);
int a=query(s,mid,lson);
int b=query(mid+1,t,rson);
int m=min(rsum[lrt],mid+1-s);
int n=min(lsum[rrt],t-mid);
m=arr[mid]<arr[mid+1]?m+n:0;
return max(a,b,m);
}
}st;
int main()
{
int t,m,n;
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=0;i<n;i++) scanf("%d",st.arr+i);
st.build(0,n-1,1);
char op[2];int x,y;
for(int i=0;i<m;i++)
{
scanf("%s%d%d",op,&x,&y);
if(op[0]=='Q') printf("%d\n",st.query(x,y,0,n-1,1));
else st.update(x,y,0,n-1,1);
}
}
return 0;
}
专题——线段树和树状数组(HDOJ)14 LCIS
最新推荐文章于 2020-10-23 12:27:05 发布