一道分块的入门题
详见题解
前
n−−√
n
的预处理剩下的暴力求。
#include<bits/stdc++.h>
#define il inline
using namespace std;
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
il int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=(x+(x<<2)<<1)+c-48;
return x*f;
}
il bool cread(){
char c=getchar();
for(;!isalpha(c);c=getchar()) ;
return c=='A';
}
char sr[1<<21],z[20];int C=-1,Z;
il void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
il void print(int x){
if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
int n,m,s,a[150005],ans[150005][389];
int main(){
n=read(),m=read(),s=sqrt(n);
for(int i=1;i<=n;++i){
a[i]=read();
for(int j=1;j<=s;++j)
ans[j][i%j]+=a[i];
}
while(m--){
int opt=cread(),x=read(),y=read();
if(opt)
if(x<=s) print(ans[x][y]);
else{
int sum=0;
for(int i=y;i<=n;i+=x) sum+=a[i];
print(sum);
}
else{
for(int i=1;i<=s;++i) ans[i][x%i]+=y-a[x];
a[x]=y;
}
}Ot();return 0;
}