记录编号 |
575572 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
数列操作C |
最终得分 |
100 |
用户昵称 |
ムラサメ |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
5.100 s |
提交时间 |
2022-09-21 20:45:44 |
内存使用 |
10.47 MiB |
显示代码纯文本
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll n,m,sq,x,y,k,j;
ll belong[100010],sum[100010],a[100010],l[100010],r[100010],mark[100010];
string opt;
int size(int x){
return r[x]-l[x]+1;
}
int main(){
freopen("shuliec.in","r",stdin);
freopen("shuliec.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
sq=ceil(sqrt(n));
for(int i=1;i<=n;i++){
cin>>a[i];
belong[i]=i/sq;
sum[belong[i]]+=a[i];
}
for(int i=1;i<=n;i++){
if(!l[belong[i]]){
l[belong[i]]=i;
}
}
for(int i=n;i;i--){
if(!r[belong[i]]){
r[belong[i]]=i;
}
}
cin>>m;
while(m--){
cin>>opt;
if(opt[0]=='A'){
cin>>x>>y>>k;
for(j=x;j<=y;j++){
if(l[belong[j]]==j){
break;
}
a[j]+=k;
sum[belong[j]]+=k;
}
for(;j<=y;j+=size(belong[j])){
if(r[belong[j]]>y){
break;
}
sum[belong[j]]+=k*size(belong[j]);
mark[belong[j]]+=k;
}
for(;j<=y;j++){
a[j]+=k;
sum[belong[j]]+=k;
}
}
else{
cin>>x>>y;
ll ans=0;
for(j=x;j<=y;j++){
if(l[belong[j]]==j){
break;
}
ans+=a[j]+mark[belong[j]];
}
for(;j<=y;j+=size(belong[j])){
if(r[belong[j]]>y){
break;
}
ans+=sum[belong[j]];
}
for(;j<=y;j++){
ans+=a[j]+mark[belong[j]];
}
cout<<ans<<endl;
}
}
return 0;
}