记录编号 |
601021 |
评测结果 |
AAAAAAAAAA |
题目名称 |
2264.魔法传输 |
最终得分 |
100 |
用户昵称 |
李奇文 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.552 s |
提交时间 |
2025-05-24 15:36:35 |
内存使用 |
5.50 MiB |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
#define ls (p<<1)
#define rs (p<<1|1)
using namespace std;
const int N=100010;
const int MOD=1e9+7;
struct Seg
{
int val,tag;
}a[4*N];
int n,m;
char c[3];
void push_up(int p){a[p].val=(a[ls].val+a[rs].val)%MOD;}
int push_down(int p,int l,int r)
{
int mid=(l+r)/2;
if(a[p].tag)
{
a[ls].val=(a[ls].val+a[p].tag*(mid-l+1))%MOD;
a[ls].tag=(a[ls].tag+a[p].tag)%MOD;
a[rs].val=(a[rs].val+a[p].tag*(r-mid))%MOD;
a[rs].tag=(a[rs].tag+a[p].tag)%MOD;
a[p].tag=0;
}
return mid;
}
void add(int l,int r,int z,int zl,int zr,int p)
{
if(l<=zl&&zr<=r)
{
a[p].val=(a[p].val+(zr-zl+1)*z)%MOD;
a[p].tag=(a[p].tag+z)%MOD;
return;
}
int mid=push_down(p,zl,zr);
if(l<=mid) add(l,r,z,zl,mid,ls);
if(mid<r) add(l,r,z,mid+1,zr,rs);
push_up(p);
return;
}
int query(int l,int r,int zl,int zr,int p)
{
if(l<=zl&&zr<=r) return a[p].val;
int mid=push_down(p,zl,zr),ans=0;
if(l<=mid) ans=(ans+query(l,r,zl,mid,ls))%MOD;
if(mid<r) ans=(ans+query(l,r,mid+1,zr,rs))%MOD;
return (ans+MOD)%MOD;
}
signed main()
{
freopen("magics.in","r",stdin);
freopen("magics.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(int i=1,l,r;i<=m;i++)
{
scanf("%s",c);
if(c[0]=='C')
{
scanf("%lld%lld",&l,&r);
add(l,r,1,1,n,1);
if(r!=n) add(r+1,r+1,l-r-1,1,n,1);
}
else{
scanf("%lld",&l);
printf("%lld\n",query(1,l,1,n,1));
}
}
return 0;
}