HDU 3308 LCIS

来源:互联网 发布:初学java看什么书好 编辑:程序博客网 时间:2024/05/01 20:11
#include "cstdio"#include "algorithm"using namespace std;#define maxn 111111#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int a[maxn];int lmax[maxn<<2],rmax[maxn<<2],mmax[maxn<<2];void pushup(int l,int r,int rt){    int m=(l+r)>>1;    lmax[rt]=lmax[rt<<1];    rmax[rt]=rmax[rt<<1|1];    mmax[rt]=max(mmax[rt<<1],mmax[rt<<1|1]);    if(a[m]<a[m+1]){        if(lmax[rt]==m-l+1)  lmax[rt]+=lmax[rt<<1|1];        if(rmax[rt]==r-m)  rmax[rt]+=rmax[rt<<1];        mmax[rt]=max(mmax[rt],rmax[rt<<1]+lmax[rt<<1|1]);    }}void build(int l,int r,int rt){    if(l==r){        lmax[rt]=rmax[rt]=mmax[rt]=1;        return;    }    int m=(l+r)>>1;    build(lson);    build(rson);    pushup(l,r,rt);}void update(int p,int v,int l,int r,int rt){    if(l==r){        a[p]=v;        return;    }    int m=(l+r)>>1;    if(p<=m)  update(p,v,lson);    else  update(p,v,rson);    pushup(l,r,rt);}int query(int L,int R,int l,int r,int rt){    if(L<=l&&r<=R){        return mmax[rt];    }    int m=(l+r)>>1;    int ans=0;    if(L<=m)  ans=max(ans,query(L,R,lson));    if(R>m)  ans=max(ans,query(L,R,rson));    if(a[m+1]>a[m]){        ans= max(ans,min(m-L+1,rmax[rt<<1])+min(R-m,lmax[rt<<1|1]) );    }    return ans;}int main(){    int t;    int x,y;    char s[5];    scanf("%d",&t);    while(t--){        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--){            scanf("%s",s);            if(s[0]=='Q'){                scanf("%d%d",&x,&y);                x++,y++;                printf("%d\n",query(x,y,1,n,1));            }else{                scanf("%d%d",&x,&y);                x++;                update(x,y,1,n,1);            }        }    }    return 0;}

0 0
原创粉丝点击