记录编号 |
601035 |
评测结果 |
AAAAAAAAAA |
题目名称 |
2264.魔法传输 |
最终得分 |
100 |
用户昵称 |
会挽弯弓满月 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.462 s |
提交时间 |
2025-05-24 16:32:28 |
内存使用 |
5.45 MiB |
显示代码纯文本
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10,mod=1000000007;
ll read(){
ll x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return f*x;
}
ll n,m;
char c;
ll a[4*N],tag[4*N];
void sc(ll p){
a[p]=(a[p*2]+a[p*2+1])%mod;
return;
}
void xc(ll p,ll l,ll r){
if(tag[p]==0) return;
ll mid=(l+r)>>1;
a[p*2]=(a[p*2]+tag[p]*(mid-l+1))%mod;
a[p*2+1]=(a[p*2+1]+tag[p]*(r-mid))%mod;
tag[p*2]=(tag[p*2]+tag[p])%mod;
tag[p*2+1]=(tag[p*2+1]+tag[p])%mod;
tag[p]=0;
return;
}
void insert(ll p,ll l,ll r,ll ls,ll rs,ll d){
if(l==ls&&r==rs){
a[p]=(a[p]+(r-l+1)*d)%mod;
tag[p]=(tag[p]+d)%mod;
return;
}
xc(p,l,r);
ll mid=(l+r)>>1;
if(rs<=mid) insert(p*2,l,mid,ls,rs,d);
else if(mid<ls) insert(p*2+1,mid+1,r,ls,rs,d);
else{
insert(p*2,l,mid,ls,mid,d);
insert(p*2+1,mid+1,r,mid+1,rs,d);
}
sc(p);
return;
}
ll query(ll p,ll l,ll r,ll ls,ll rs){
if(l==ls&&r==rs) return a[p];
xc(p,l,r);
ll mid=(l+r)>>1;
if(rs<=mid) return query(p*2,l,mid,ls,rs);
else if(mid<ls) return query(p*2+1,mid+1,r,mid+1,rs);
ll res=0;
res=(res+query(p*2,l,mid,ls,mid))%mod;
res=(res+query(p*2+1,mid+1,r,mid+1,rs))%mod;
return (res+mod)%mod;
}
int main(){
freopen("magics.in","r",stdin);
freopen("magics.out","w",stdout);
n=read();m=read();
ll l,r,ans;
for(ll i=1;i<=m;i++){
c=getchar();
if(c=='C'){
l=read();r=read();
insert(1,1,n,l,r,1);
if(r!=n) insert(1,1,n,r+1,r+1,l-r-1);
}
else{
l=read();
ans=query(1,1,n,1,l);
printf("%lld\n",ans);
}
}
return 0;
}