Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2571 Accepted Submission(s): 837
#include <string.h> #include <iostream> #include <stdio.h> using namespace std; #define MAXN 50005 #define lnum num<<1 #define rnum num<<1|1 struct node { int color,prime,listadd[55]; }tree[4*MAXN]; #define inf 0 int modleft[11][11]; void build(int num ,int l,int r) { memset(tree[num].listadd,0,sizeof(tree[num].listadd)); tree[num].color=0; int mid=(l+r)>>1; if(l>=r) { scanf("%d",&tree[num].prime); return ; } build(lnum,l,mid); build(rnum,mid+1,r); } void pushdown(int num) { int i; if(tree[num].color!=inf) { tree[lnum].color=tree[num].color; tree[rnum].color=tree[num].color; tree[num].color=inf;//还原标记 for(i=0;i<55;i++) { tree[lnum].listadd[i]+=tree[num].listadd[i]; tree[rnum].listadd[i]+=tree[num].listadd[i]; tree[num].listadd[i]=0; } } } void update(int s,int e,int a,int b,int num,int amk,int k,int c ) { int i; if(a<=s&&b>=e) { tree[num].color=k;//需要更新 tree[num].listadd[modleft[k][amk]]+=c; return ; } pushdown(num); int mid=(s+e)>>1; if(mid>=a) update(s,mid,a,b,lnum,amk,k,c); if(mid<b) update(mid+1,e,a,b,rnum,amk,k,c); } int query(int s,int e,int num,int x)//充分利用这个延时标记 { int i; if(s>=e) { int temp=tree[num].prime; for(i=1;i<=10;i++) { temp+=tree[num].listadd[modleft[i][x%i]]; tree[num].listadd[modleft[i][x%i]]=0; } tree[num].prime=temp;//更新为新的值 return temp; } pushdown(num); int mid=(s+e)>>1; if(x>mid) return query(mid+1,e,rnum,x); else { return query(s,mid,lnum,x); } } int main() { int asknum,num12,x,a,b,n,k,c; int i,j,cnt=0; for(i=1;i<=10;i++) for(j=0;j<i;j++) { modleft[i][j]=cnt++;//省了一半的空间 } while(scanf("%d",&n)!=EOF) { build(1,1,n); scanf("%d",&asknum); while(asknum--) { scanf("%d",&num12); if(num12==1) { scanf("%d%d%d%d",&a,&b,&k,&c); update(1,n,a,b,1,a%k,k,c); } else{ scanf("%d",&x); printf("%d\n",query(1,n,1,x)); } } } return 0; }