记录编号 393880 评测结果 AAAAAAAAAAAAAAAATTTT
题目名称 新史「新幻想史 -现代史-」 最终得分 80
用户昵称 Gravatarscpointer 是否通过 未通过
代码语言 C++ 运行时间 8.965 s
提交时间 2017-04-12 12:10:28 内存使用 215.36 MiB
显示代码纯文本
    #include <cstdio>
    typedef long long ll;
    inline int RD()
    {
    	int res;char cr;
    	while( (cr=getchar())<'0' || cr>'9'); res=cr-'0';
    	while( (cr=getchar())>='0' && cr<='9') res=res*10+cr-'0';
    	return res;
    }
    inline char RC()
    {
    	char cr;
    	while( (cr=getchar())<'A' || cr>'Z');
    	return cr;
    }
     
    #define N 50050
    #define NDS 12500050
    #define LIM 50000
    #define lowbit(x) ((x)&(-x))
    int rot[N];
     
    int ls[NDS],rs[NDS],ndcnt;
    ll sum[NDS];
	int prev[NDS];
    void pushdown(int rt,int l,int r)
    {
    	if(prev[rt])
    	{
    		if(!ls[rt]) ls[rt]=++ndcnt;
    		if(!rs[rt]) rs[rt]=++ndcnt;
    		int mid=(l+r)>>1;
    		prev[ls[rt]]+=prev[rt];
    		prev[rs[rt]]+=prev[rt];
    		sum[ls[rt]]+=prev[rt]*(mid-l+1);
    		sum[rs[rt]]+=prev[rt]*(r-mid);
    		prev[rt]=0;
    	}
    }
    void update(int rt){sum[rt]=sum[ls[rt]]+sum[rs[rt]];}
    void add(int &rt,int gl,int gr,ll gv,int l=1,int r=LIM)
    {
    	if(!rt) rt=++ndcnt;
    	else pushdown(rt,l,r);
    	if(gl==l && gr==r)
    	{
    		prev[rt]+=gv;
    		sum[rt]+=gv*(r-l+1);
    		return;
    	}
    	int mid=(l+r)>>1;
    	if(gr<=mid) add(ls[rt],gl,gr,gv,l,mid);
    	else if(gl>mid) add(rs[rt],gl,gr,gv,mid+1,r);
    	else add(ls[rt],gl,mid,gv,l,mid),add(rs[rt],mid+1,gr,gv,mid+1,r);
    	update(rt);
    }
    ll getsum(int &rt,int gl,int gr,int l=1,int r=LIM)
    {
    	if(!rt) return 0;
		else if(!ls[rt] && !rs[rt]) return sum[rt]/(r-l+1)*(gr-gl+1);
    	else pushdown(rt,l,r);
    	if(gl==l && gr==r)
    		return sum[rt];
    	int mid=(l+r)>>1;
    	if(gr<=mid) return getsum(ls[rt],gl,gr,l,mid);
    	else if(gl>mid) return getsum(rs[rt],gl,gr,mid+1,r);
    	else return getsum(ls[rt],gl,mid,l,mid)+getsum(rs[rt],mid+1,gr,mid+1,r);
    }
     
    ll ai[N];
    int main()
    {
    	freopen("cdcq_a.in","r",stdin);
    	freopen("cdcq_a.out","w",stdout);
    	int n,Q;n=RD();Q=RD();
    	for(int i=1;i<=n;i++)
    		ai[i]=ai[i-1]+RD();
    	while(Q--)
    	{
    		if(RC()=='M')
    		{
    			int l1,r1,v1,l2,r2,v2,tim;
    			l1=RD();r1=RD();v1=RD();l2=RD();r2=RD();v2=RD();tim=RD();
    			for(;tim<=LIM;tim+=lowbit(tim))
    				add(rot[tim],l1,r1,-v1),add(rot[tim],l2,r2,v2);
    		}
    		else
    		{
    			int l,r,tim;ll ans=0;
    			l=RD();r=RD();tim=RD();
    			for(;tim;tim-=lowbit(tim))
    				ans+=getsum(rot[tim],l,r);
    			printf("%lld\n",ans+ai[r]-ai[l-1]);
    		}
    	}
    }