T1
数列区间修改,单点查询。线段树,树状数组都可。(代码抄的)
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 typedef long long ll; 6 const int maxn=5e4+5; 7 8 int n,blo; 9 int v[maxn],bl[maxn],atag[maxn]; 10 11 void add(int a,int b,int c){ 12 for(int i=a;i<=min(bl[a]*blo,b);i++) 13 v[i]+=c; 14 if(bl[a]!=bl[b]) 15 for(int i=(bl[b]-1)*blo+1;i<=b;i++) 16 v[i]+=c; 17 for(int i=bl[a]+1;i<=bl[b]-1;i++) 18 atag[i]+=c; 19 } 20 21 int main() 22 { 23 scanf("%d",&n);blo=sqrt(n); 24 for(int i=1;i<=n;i++) scanf("%d",&v[i]); 25 for(int i=1;i<=n;i++) bl[i]=(i-1)/blo+1; 26 for(int i=1;i<=n;i++) 27 { 28 int op,a,b,c; 29 scanf("%d%d%d%d",&op,&a,&b,&c); 30 if(op==0) add(a,b,c); 31 if(op==1) printf("%d\n",v[b]+atag[bl[b]]); 32 } 33 return 0; 34 }