一开始维护10*10的空间无情的被爆了,然后只开55的空间,还是爆了,没办法只能继续优化代码,加了一个build总算把空间剪下来了。正解还是得用树状数组啊,有时间再去了解,先贴个代码水过。。。
ACcode:
#include<cstdio>
#include<iostream>
#include<cstring>
const int nsize=50001;
int arr[nsize],ys[11][11];
int sum[nsize*3][55];
void PushDown(int rt,int t)
{
if (sum[rt][t])
{
sum[rt<<1][t]+=sum[rt][t];
sum[rt<<1|1][t]+=sum[rt][t];
sum[rt][t]=0;
}
}
void build(int rt,int l,int r,int t)
{
sum[rt][t]=0;
if (l==r) return ;
int m=(l+r)>>1;
build(rt<<1,l,m,t);
build(rt<<1|1,m+1,r,t);
}
void update(int rt,int l,int r,int L,int R,int t,int v)
{
if (L<=l&&r<=R)
{
sum[rt][t]+=v;
return ;
}
PushDown(rt,t);
int m=(l+r)>>1;
if (L<=m) update(rt<<1,l,m,L,R,t,v);
if (R>m) update(rt<<1|1,m+1,r,L,R,t,v);
}
int query(int rt,int l,int r,int p,int t)
{
if (l==r) return sum[rt][t];
PushDown(rt,t);
int m=(l+r)>>1;
if (p<=m) return query(rt<<1,l,m,p,t);
else return query(rt<<1|1,m+1,r,p,t);
}
int main()
{
int i,j,n,q,L,R;
int op,a,b,c,k;
for (k=0,a=1; a<=10; a++) for (b=0; b<a; b++) ys[a][b]=k++;
while (~scanf("%d",&n))
{
for (i=1; i<=n; i++) scanf("%d",arr+i);
for (i=1; i<=10; i++) for (j=0; j<i; j++)
build(1,0,n/i,ys[i][j]);
scanf("%d",&q);
while (q--)
{
scanf("%d%d",&op,&a);
if (op==1)
{
scanf("%d%d%d",&b,&k,&c);
update(1,0,n/k,a/k,(b-a%k)/k,ys[k][a%k],c);
}
else
{
for (k=0,i=1; i<=10; i++)
k+=query(1,0,n/i,a/i,ys[i][a%i]);
printf("%d\n",arr[a]+k);
}
}
}
return 0;
}