记录编号 315743 评测结果 AAAAAAAAAA
题目名称 魔法传输 最终得分 100
用户昵称 GravatarHzoi_Go灬Fire 是否通过 通过
代码语言 C++ 运行时间 1.606 s
提交时间 2016-10-05 20:12:34 内存使用 4.40 MiB
显示代码纯文本
/*
  Name: 魔法传输 
  Copyright: 
  Author: Go灬Fire 
  Date: 05/10/16 19:51
  Description: 神题,线段树差分;
  			   给一个序列,从l个开始,第i个加i-l+1的魔法值
			   修改:线段树数组修改区间l~r,都加1,r+1减去r-l+1, 
			   查询:前缀和,查询1到x,等价于求前缀和 
*/
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r 
#define Begin freopen("magics.in","r",stdin);freopen("magics.out","w",stdout);
#define End fclose(stdin);fclose(stdout);
using namespace std;
const int maxn=150000;
const int mod=1000000007;
struct Node{
	int date,lazy;
}a[maxn*4];
int n,m;   
void Init();
void Update(int rt,int l,int r){
	int k=a[rt].lazy;a[rt].lazy=0;
	a[rt<<1].lazy+=k;a[rt<<1|1].lazy+=k;
	int mid=(l+r)>>1;
	a[rt<<1].date+=(mid-l+1)*k;a[rt<<1|1].date+=(r-mid)*k;
}
void Tree_Insert(int s,int t,int z,int rt,int l,int r){
	if(s<=l && t>=r){
		a[rt].date+=(r-l+1)*z;
		a[rt].lazy+=z;
		return;
	}
	if(a[rt].lazy)Update(rt,l,r);
	int mid=(l+r)>>1;
	if(s<=mid)Tree_Insert(s,t,z,lson);
	if(t>mid)Tree_Insert(s,t,z,rson);
	a[rt].date=a[rt<<1].date+a[rt<<1|1].date;
	a[rt].date%=mod; 
}
int Tree_query(int s,int t,int rt,int l,int r){
	if(s<=l && t>=r)return a[rt].date;
	int mid=(l+r)>>1;
	if(a[rt].lazy)Update(rt,l,r);
	if(t<=mid)return Tree_query(s,t,lson);
	if(s>mid)return Tree_query(s,t,rson);
	return Tree_query(s,t,lson)+Tree_query(s,t,rson);
}
int main(){
    Begin;
    Init();
    //system("pause");
    End;
    return 0;
}
void Init(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		char ch;cin>>ch;
		if(ch=='C'){
			int x,y;scanf("%d%d",&x,&y);
			Tree_Insert(x,y,1,1,1,n);
			Tree_Insert(y+1,y+1,-(y-x+1),1,1,n);
		}
		else {
			int x;scanf("%d",&x);
			printf("%d\n",Tree_query(1,x,1,1,n)%mod);
		}
	}
}