记录编号 304385 评测结果 AAAAAAAAAA
题目名称 魔法传输 最终得分 100
用户昵称 GravatarOstmbh 是否通过 通过
代码语言 C++ 运行时间 1.950 s
提交时间 2016-09-08 12:43:30 内存使用 8.87 MiB
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
#define ll A[o].l
#define rr A[o].r
const int MAX=100000+10;
struct T{
	int l,r;
	long long sum,addv;
}A[MAX<<2];
int B[MAX];
inline void maketree(int o,int L,int R){
	ll=L;
	rr=R;
	A[o].addv=0;
	A[o].sum=B[L];
	if(L!=R){
		int M=(L+R)>>1;
		maketree(o<<1,L,M);
		maketree(o<<1|1,M+1,R);
		A[o].sum=A[o<<1].sum+A[o<<1|1].sum;
	}
}
inline void downdate(int o);
inline void add(int o,int L,int R,int ad);
inline long long summ(int o,int L,int R){
	if(L<=ll&&rr<=R)
		return A[o].sum;
	else if(ll!=rr){
		long long ans=0;
		downdate(o);
		int M=(ll+rr)>>1;
		if(M>=L)
			ans+=summ(o<<1,L,R);
		ans%=1000000007;
		if(M<R)
			ans+=summ(o<<1|1,L,R);
		ans%=1000000007;
		return ans%1000000007;
	}
}
inline void readchar(char& x){
	x=getchar();
	while(x!='C'&&x!='Q')
		x=getchar();
}
int main(){
	freopen("magics.in","r",stdin);
	freopen("magics.out","w",stdout);
	int n;
	scanf("%d",&n);
	int m;
	scanf("%d",&m);
	int x,y;
	maketree(1,1,n);
	char c;
	for(int i=1;i<=m;i++){
		readchar(c);
		if(c=='C'){
			scanf("%d %d",&x,&y);
			add(1,x,y,1);
			int cd=y-x+1;
			add(1,y+1,y+1,-cd);
		}
		else {
			scanf("%d",&x);
			cout<<summ(1,1,x)%1000000007<<endl;
		}
	}
return 0;
}
inline void downdate(int o){
	A[o<<1].addv+=A[o].addv;
	A[o<<1].sum+=A[o].addv*(A[o<<1].r-A[o<<1].l+1);
	A[o<<1|1].addv+=A[o].addv;
	A[o<<1|1].sum+=A[o].addv*(A[o<<1|1].r-A[o<<1|1].l+1);
	A[o].addv=0; 
}
inline void add(int o,int L,int R,int ad){
	if(L<=ll&&rr<=R){
		A[o].addv+=ad;
		A[o].sum+=ad*(rr-ll+1);
	}
	else if(ll!=rr){
		int M=(ll+rr)>>1;
		if(M>=L)
			add(o<<1,L,R,ad);
		if(M<R)
			add(o<<1|1,L,R,ad);
		A[o].sum=A[o<<1].sum+A[o<<1|1].sum+A[o].addv*(rr-ll+1);
	}
}