【UESTC】1425 Another LCIS

  1 #include<cstdio>

  2 #define MAXN 100010

  3 struct node

  4 {

  5     int left,right,res,add,x,y;

  6 };

  7 node tree[MAXN<<2];

  8 int n;

  9 inline int MAX(int x,int y)

 10 {

 11     return x>y?x:y;

 12 }

 13 inline int MIN(int x,int y)

 14 {

 15     return x>y?y:x;

 16 }

 17 inline void PushUp(int mid,int L,int R,int rt)

 18 {

 19     tree[rt].x=tree[rt<<1].x;

 20     tree[rt].y=tree[rt<<1|1].y;

 21     tree[rt].left=tree[rt<<1].left;

 22     tree[rt].right=tree[rt<<1|1].right;

 23     tree[rt].res=MAX(tree[rt<<1].res,tree[rt<<1|1].res);

 24     if(tree[rt<<1].y<tree[rt<<1|1].x)

 25     {

 26         if(tree[rt].left==mid-L+1)

 27             tree[rt].left+=tree[rt<<1|1].left;

 28         if(tree[rt].right==R-mid)

 29             tree[rt].right+=tree[rt<<1].right;

 30         tree[rt].res=MAX(tree[rt].res,tree[rt<<1].right+tree[rt<<1|1].left);

 31     }

 32 }

 33 inline void PushDown(int L,int R,int rt)

 34 {

 35     if(tree[rt].add)

 36     {

 37         tree[rt<<1].add+=tree[rt].add;

 38         tree[rt<<1|1].add+=tree[rt].add;

 39         tree[rt<<1].x+=tree[rt].add;

 40         tree[rt<<1].y+=tree[rt].add;

 41         tree[rt<<1|1].x+=tree[rt].add;

 42         tree[rt<<1|1].y+=tree[rt].add;

 43         tree[rt].add=0;

 44     }

 45 }

 46 void Build(int L,int R,int rt)

 47 {

 48     tree[rt].add=0;

 49     if(L==R)

 50     {

 51         scanf("%d",&tree[rt].x);

 52         tree[rt].y=tree[rt].x;

 53         tree[rt].left=tree[rt].right=tree[rt].res=1;

 54     }

 55     else

 56     {

 57         int mid=(L+R)>>1;

 58         Build(L,mid,rt<<1);

 59         Build(mid+1,R,rt<<1|1);

 60         PushUp(mid,L,R,rt);

 61     }

 62 }

 63 void Update(int x,int y,int val,int L,int R,int rt)

 64 {

 65     if(x<=L&&R<=y)

 66     {

 67         tree[rt].add+=val;

 68         tree[rt].x+=val;

 69         tree[rt].y+=val;

 70     }

 71     else

 72     {

 73         int mid=(L+R)>>1;

 74         PushDown(L,R,rt);

 75         if(mid>=x)

 76             Update(x,y,val,L,mid,rt<<1);

 77         if(y>mid)

 78             Update(x,y,val,mid+1,R,rt<<1|1);

 79         PushUp(mid,L,R,rt);

 80     }

 81 }

 82 int Query(int x,int y,int L,int R,int rt)

 83 {

 84     if(x<=L&&R<=y)

 85         return tree[rt].res;

 86     int mid=(L+R)>>1,ans=0;

 87     PushDown(L,R,rt);

 88     if(mid>=x)

 89         ans=MAX(ans,Query(x,y,L,mid,rt<<1));

 90     if(y>mid)

 91         ans=MAX(ans,Query(x,y,mid+1,R,rt<<1|1));

 92     if(tree[rt<<1].y<tree[rt<<1|1].x)

 93         ans=MAX(ans,MIN(mid-x+1,tree[rt<<1].right)+MIN(y-mid,tree[rt<<1|1].left));

 94     return ans;

 95 }

 96 int main()

 97 {

 98     char ch;

 99     int c,m,x,y,v,ca=1;

100     scanf("%d",&c);

101     while(c--)

102     {

103         scanf("%d%d",&n,&m);

104         Build(1,n,1);

105         printf("Case #%d:\n",ca++);

106         while(m--)

107         {

108             scanf(" %c",&ch);

109             if(ch=='a')

110             {

111                 scanf("%d%d%d",&x,&y,&v);

112                 Update(x,y,v,1,n,1);

113             }

114             else

115             {

116                 scanf("%d%d",&x,&y);

117                 printf("%d\n",Query(x,y,1,n,1));

118             }

119         }

120     }

121     return 0;

122 }

你可能感兴趣的:(CI)