#include <bits/stdc++.h>using namespace std; #define N 100100int a[n];struct {int left,right,c; int ln,rn; int ls,rs,ms;} b[n*4];void pushup (int i) {b[i].ls=b[i*2].ls; b[i].rs=b[2*i+1].rs; B[I].LN=B[I*2].LN; B[i].rn=b[2*i+1].rn; B[i].ms=max (b[2*i].ms,b[2*i+1].ms); if (B[2*I].RN<B[2*I+1].LN) {if (b[2*i].ls = = b[2*i].c) b[i].ls+=b[2*i+1].ls; if (b[2*i+1].ls = = b[2*i+1].c) b[i].rs+=b[2*i].rs; B[i].ms=max (b[i].ms,b[2*i+1].ls+b[i*2].rs); }}void Build (int left,int right,int i) {int mid; b[i].left=left;b[i].right=right;b[i].c=right-left+1; if (left==right) {b[i].ln=b[i].rn=a[left]; B[i].ls=b[i].rs=b[i].ms=1; return; } mid = (left+right)/2; Build (Left,mid,2*i); Build (mid+1,right,2*i+1); Pushup (i);} void Insert (int i,int t,int m) {if (b[i].left==b[i].right) {b[i].ln=b[i].rn=m; return; } int mid= (b[i].left+b[i].right) >>1; if (t<=mid) Insert (2*i,t,m); if (T>mid) InsERT (2*I+1,T,M); Pushup (i);} int Query (int l,int r,int i) {if (b[i].left>=l && b[i].right<=r) return b[i].ms; int mid= (b[i].right+b[i].left) >>1,ans=0; if (l<=mid) Ans=max (Ans,query (l,r,2*i)); if (r>mid) Ans=max (Ans,query (l,r,2*i+1)); if (b[2*i].rn<b[2*i+1].ln) ans = max (ans, min (mid-l+1,b[2*i].rs) +min (r-mid,b[2*i+1].ls)); return ans;} int main () {int t; scanf ("%d", &t); while (t--) {memset (b,0,sizeof (b)); int n,m; scanf ("%d%d", &n,&m); for (int i=1;i<=n;i++) scanf ("%d", &a[i]); Build (1,n,1); while (m--) {char q[10]; int x, y; GetChar (); scanf ("%s%d%d", q,&x,&y); if (q[0]== ' U ') Insert (1,x+1,y); else printf ("%d\n", Query (x+1,y+1,1)); } }}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
Segment Tree interval Merging LCIShdu3308