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