diff --git a/HDOJ/3308_libin56842.cpp b/HDOJ/3308_libin56842.cpp new file mode 100644 index 0000000..68d9c4b --- /dev/null +++ b/HDOJ/3308_libin56842.cpp @@ -0,0 +1,104 @@ +#include +#include +#include +using namespace std; + +const int L = 111111; +int n,m,s[L]; + +struct node +{ + int l,r,c;//左右边界与连续的长度 + int ln,rn;//左右边界的值 + int ls,rs,ms,;//左右最大LCIS,和区间最大LCIS +} a[L<<2]; + +void pushup(int i) +{ + a[i].ls = a[2*i].ls; + a[i].rs = a[2*i+1].rs; + a[i].ln = a[2*i].ln; + a[i].rn = a[2*i+1].rn; + a[i].ms = max(a[2*i].ms,a[2*i+1].ms); + if(a[2*i].rn>1; + init(l,mid,2*i); + init(mid+1,r,2*i+1); + pushup(i); +} + +void insert(int i,int t,int m) +{ + if(a[i].l == a[i].r) + { + a[i].ln = a[i].rn = m; + return; + } + int mid = (a[i].l+a[i].r)>>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)//查询最大的LCIS +{ + if(a[i].l>=l && a[i].r<=r) + { + return a[i].ms; + } + int mid = (a[i].l+a[i].r)>>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(a[2*i].rn < a[2*i+1].ln) + ans = max(ans , min(mid-l+1,a[2*i].rs)+min(r-mid,a[2*i+1].ls)); + return ans; +} + + +int main() +{ + int t,i,l,r; + char str[5]; + scanf("%d",&t); + while(t--) + { + scanf("%d%d",&n,&m); + for(i = 1; i<=n; i++) + scanf("%d",&s[i]); + init(1,n,1); + while(m--) + { + scanf("%s%d%d",str,&l,&r); + if(str[0] == 'Q') + printf("%d\n",query(l+1,r+1,1)); + else + insert(1,l+1,r); + } + } + + return 0; +}