记录编号 |
315743 |
评测结果 |
AAAAAAAAAA |
题目名称 |
魔法传输 |
最终得分 |
100 |
用户昵称 |
Hzoi_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);
}
}
}