记录编号 |
294447 |
评测结果 |
AAAAAAAAAA |
题目名称 |
魔法传输 |
最终得分 |
100 |
用户昵称 |
dateri |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.598 s |
提交时间 |
2016-08-12 08:25:24 |
内存使用 |
4.40 MiB |
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mod 1000000007
using namespace std;
int a[100001<<2],flag[100001<<2],count[100001<<2];
void build(int l,int r,int rt)
{
if(l==r)
return ;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void down(int rt,int m)
{
if(count[rt])
{
if(m-(m>>1)==1)
a[rt<<1]=(a[rt<<1]+((flag[rt]+(flag[rt]+(m-(m>>1)-1)*count[rt]))*(m-(m>>1))>>1))%mod;
else
{
flag[rt<<1]=(flag[rt<<1]+flag[rt])%mod;
count[rt<<1]+=count[rt];
}
if((m>>1)==1)
a[rt<<1|1]=(a[rt<<1|1]+((flag[rt]+(m-(m>>1))*count[rt])+(flag[rt]+(m-1)*count[rt])*(m>>1)>>1))%mod;
else
{
flag[rt<<1|1]=(flag[rt<<1|1]+flag[rt]+(m-(m>>1))*count[rt])%mod;
count[rt<<1|1]+=count[rt];
}
flag[rt]=0;
count[rt]=0;
}
}
void up(int L,int R,int l,int r,int rt)
{
if(l>=L&&r<=R)
{
if(l!=r)
{
flag[rt]=(flag[rt]+l-L+1)%mod;
count[rt]++;
}
else
a[rt]=(a[rt]+l-L+1)%mod;
return ;
}
down(rt,r-l+1);
int m=l+r>>1;
if(m>=L) up(L,R,lson);
if(m+1<=R) up(L,R,rson);
}
void query(int l,int r,int rt,int x)
{
if(l==r)
{
printf("%d\n",a[rt]);
return ;
}
down(rt,r-l+1);
int m=l+r>>1;
if(m>=x)
query(lson,x);
else
query(rson,x);
}
int main()
{
freopen("magics.in","r",stdin);
freopen("magics.out","w",stdout);
int n,a,b,t;
char c;
scanf("%d%d",&n,&t);
while(t--)
{
c=getchar();
while(!(c>='A'&&c<='Z'))
c=getchar();
if(c=='Q')
scanf("%d",&a),query(1,n,1,a);
else
scanf("%d%d",&a,&b),up(a,b,1,n,1);
}
return 0;
}