分块模板
#include<bits/stdc++.h> using namespace std; #define MAXN 50000+10 int n,blo; int a[MAXN],bl[MAXN],tag[MAXN]; void update(int l,int r,int add) { for (int i=l; i<=min(bl[l]*blo,r); i++) a[i]+=add; if (bl[l]!=bl[r]) for (int i=(bl[r]-1)*blo+1; i<=r; i++) a[i]+=add; for (int i=bl[l]+1; i<=bl[r]-1; i++) tag[i]+=add; } int main() { scanf("%d",&n),blo=sqrt(n); for (int i=1; i<=n; i++) bl[i]=(i-1)/blo+1; for (int i=1; i<=n; i++) scanf("%d",&a[i]); for (int i=1; i<=n; i++) { int opt,l,r,tmp; scanf("%d%d%d%d",&opt,&l,&r,&tmp); if (opt) printf("%d\n",a[r]+tag[bl[r]]); else update(l,r,tmp); } return 0; }