比赛 |
2025.5.24 |
评测结果 |
AAAAAAAAAA |
题目名称 |
魔法传输 |
最终得分 |
100 |
用户昵称 |
djyqjy |
运行时间 |
0.499 s |
代码语言 |
C++ |
内存使用 |
4.67 MiB |
提交时间 |
2025-05-24 10:02:25 |
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
#define ls (p<<1)
#define rs (p<<1|1)
using namespace std;
inline int re()
{
int f=1,num=0;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
return num*f;
}
const int N=100010;
const ll 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);
n=re();m=re();
for(int i=1,l,r;i<=m;i++)
{
scanf("%s",c);
if(c[0]=='C')
{
l=re();r=re();
add(l,r,1,1,n,1);
if(r!=n) add(r+1,r+1,l-r-1,1,n,1);
}
else printf("%lld\n",query(1,re(),1,n,1));
}
return 0;
}