2019 icpc 銀川區域賽 G Pot!! (線段樹)

 

#include <bits/stdc++.h>

const int maxn = 1e5 + 5;

int n,q;

struct SegTree
{
	int maxx[maxn<<2],lazy[maxn<<2];
	inline void pushdown(int o)
    {
        if(lazy[o])
        {
            maxx[o<<1]+=lazy[o];
            maxx[o<<1|1]+=lazy[o];
            lazy[o<<1]+=lazy[o];
            lazy[o<<1|1]+=lazy[o];
            lazy[o]=0;
        }
    }
	inline void update(int o,int l,int r,int ql,int qr,int val)
    {
    	if(l>qr||r<ql)return;
        if(ql<=l&&r<=qr){maxx[o]+=val;lazy[o]+=val;return;}
        pushdown(o);
        int m=(l+r)>>1;
        update(o<<1,l,m,ql,qr,val);
        update(o<<1|1,m+1,r,ql,qr,val);
        maxx[o]=std::max(maxx[o<<1],maxx[o<<1|1]);
    }
    inline int query(int o,int l,int r,int ql,int qr)
    {
        if(ql<=l&&r<=qr)return maxx[o];
        pushdown(o);
        int m=(l+r)>>1;
        int ans=-1e9;
        if(ql<=m) ans=std::max(ans,query(o<<1,l,m,ql,qr));
        if(qr>m) ans=std::max(ans,query(o<<1|1,m+1,r,ql,qr));
        return ans;
    }
}st[4]; // 0:2, 1:3, 2:5, 3:7
int main()
{
#ifdef LOCAL
    freopen("input.in","r",stdin);
#endif
    scanf("%d%d",&n,&q);
    while(q--)
    {
    	int l,r;
    	char op[10];scanf("%s%d%d",op,&l,&r);
    	if(op[1]=='U')
    	{
    		int x;scanf("%d",&x);
    		if(x==2) st[0].update(1,1,n,l,r,1);
    		else if(x==3) st[1].update(1,1,n,l,r,1);
    		else if(x==4) st[0].update(1,1,n,l,r,2);
    		else if(x==5) st[2].update(1,1,n,l,r,1);
    		else if(x==6) st[0].update(1,1,n,l,r,1),st[1].update(1,1,n,l,r,1);
    		else if(x==7) st[3].update(1,1,n,l,r,1);
    		else if(x==8) st[0].update(1,1,n,l,r,3);
    		else if(x==9) st[1].update(1,1,n,l,r,2);
    		else if(x==10) st[0].update(1,1,n,l,r,1),st[2].update(1,1,n,l,r,1);
    	}
    	else
    	{
    		int ans=0;
    		for(int i=0;i<4;i++)ans=std::max(ans,st[i].query(1,1,n,l,r));
    		printf("ANSWER %d\n",ans);
    	}
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章