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