记录编号 |
333522 |
评测结果 |
AAAAAAAAAA |
题目名称 |
魔法传输 |
最终得分 |
100 |
用户昵称 |
安呐一条小咸鱼。 |
是否通过 |
通过 |
代码语言 |
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);
}
}
}