记录编号 315621 评测结果 WWWWWWWWWW
题目名称 魔法传输 最终得分 0
用户昵称 GravatarAntiLeaf 是否通过 未通过
代码语言 C++ 运行时间 1.308 s
提交时间 2016-10-05 17:16:21 内存使用 9.45 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int maxn=100010;
const LL p=1000000007;
void madd(int,int,int);
void qsum(int,int,int);
void pushdown(int,int,int,int);
LL sm[maxn<<2],lazy1[maxn<<2],lazy2[maxn<<2],ans;
int n,m,s,t,x;
char c;
int main(){
#define MINE
#ifdef MINE
	freopen("magics.in","r",stdin);
	freopen("magics.out","w",stdout);
#endif
	scanf("%d%d",&n,&m);
	while(m--){
		scanf(" %c",&c);
		if(c=='C'){
			scanf("%d%d",&s,&t);
			madd(1,n,1);
		}
		else if(c=='Q'){
			scanf("%d",&x);
			ans=0ll;
			qsum(1,n,1);
			printf("%lld\n",ans);
		}
	}
#ifndef MINE
	printf("\n--------------------DONE--------------------\n");
	for(;;);
#endif
	return 0;
}
void madd(int l,int r,int rt){
	if(s<=l&&t>=r){
		lazy2[rt]=(lazy2[rt]+1ll)%p;
		lazy1[rt]=(lazy1[rt]+(LL)(l-s))%p;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(l,r,mid,rt);
	if(s<=mid)madd(l,mid,rt<<1);
	if(t>mid)madd(mid+1,r,rt<<1|1);
	sm[rt]=(sm[rt<<1]+sm[rt<<1|1])%p;
}
void qsum(int l,int r,int rt){
	int mid=(l+r)>>1;
	pushdown(l,r,mid,rt);
	if(l==r){
		ans=sm[rt];
		return;
	}
	if(x<=mid)qsum(l,mid,rt<<1);
	else qsum(mid+1,r,rt<<1|1);
}
void pushdown(int l,int r,int mid,int rt){
	int lc=rt<<1,rc=lc|1;
	if(lazy1[rt]){
		sm[rt]=(sm[rt]+lazy1[rt]*(LL)(r-l+1))%p;
		lazy1[lc]=(lazy1[lc]+lazy1[rt])%p;
		lazy1[rc]=(lazy1[rc]+lazy1[rt])%p;
		lazy1[rt]=0ll;
	}
	if(lazy2[rt]){
		sm[rt]=(sm[rt]+lazy2[rt]*(LL)(r-l+1)%p*(LL)(r-l+2)%p)%p;
		lazy2[lc]=(lazy2[lc]+lazy2[rt])%p;
		lazy2[rc]=(lazy2[rc]+lazy2[rt])%p;
		lazy1[rc]=(lazy1[rc]+(LL)(mid-l))%p;
		lazy2[rt]=0ll;
	}
}