记录编号 333522 评测结果 AAAAAAAAAA
题目名称 魔法传输 最终得分 100
用户昵称 Gravatar安呐一条小咸鱼。 是否通过 通过
代码语言 C++ 运行时间 2.379 s
提交时间 2016-10-30 21:06:24 内存使用 6.42 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn = 100000 + 10  ;
const int mod = 1000000007 ;
ll num[maxn<<2],lazy[maxn<<2],L,R,x,u,o,n,m;
char ch[10];
ll read(){
	ll x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
#define mid ((l+r)>>1)
void update(ll rt,ll l,ll r){
	num[rt<<1]+=(mid-l+1)*lazy[rt];
	num[rt<<1] %= mod ;
	num[rt<<1|1]+=(r-mid)*lazy[rt];
	num[rt<<1|1] %= mod ;
	lazy[rt<<1]+=lazy[rt];
	lazy[rt<<1|1]+=lazy[rt];
	lazy[rt]=0;
}
ll query(ll rt,ll l,ll r){
	if( L <= l && r <= R )return num[rt];
	update(rt,l,r);
	ll ans=0;
	if( L <= mid )ans += query(rt<<1,l,mid);
	ans %= mod;
	if( R > mid )ans += query(rt<<1|1,mid+1,r);
	ans %= mod;
	return ans;
}
void change(ll rt,ll l,ll r,ll x){
	if( L <= l && r <= R ){
		num[rt]+=(r-l+1)*x;
		num[rt] %= mod ;
		lazy[rt]+=x;
		return;
	}
	update(rt,l,r);
	if( L <= mid )change(rt<<1,l,mid,x);
	if( R > mid )change(rt<<1|1,mid+1,r,x);
	num[rt]=num[rt<<1]+num[rt<<1|1];
}
int main(){
	freopen("magics.in","r",stdin);
	freopen("magics.out","w",stdout);
	n=read(); m=read();
	while(m--){
		scanf("%s",ch);
		if(ch[0]=='Q'){
			L=1,R=read();
			printf("%lld\n",query(1,1,n));
		}
		else{
			u=read();o=read();
			L=u,R=o;
			change(1,1,n,1);
			x = u - o - 1 ,L = R = o + 1 ;
			change(1,1,n,x);
		}
	}
}