分块就是将一段区间打包起来一块处理减少时间复杂度的过程。
//数列分块练习1 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #define ll long long #define N 1000009 using namespace std; ll v[N],tag[N]; int bl[N]; int n,m,blo; ll read() { char ch=getchar();ll ret=0,f=1; while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();} return f*ret; } void change(int l,int r,ll d) { for (int i=l;i<=min(bl[l]*blo,r);i++) v[i]+=d; if (bl[l]!=bl[r]) for (int i=(bl[r]-1)*blo+1;i<=r;i++) v[i]+=d; for (int i=bl[l]+1;i<=bl[r]-1;i++) tag[i]+=d; } int main() { n=read();blo=sqrt(n); for (int i=1;i<=n;i++) v[i]=read(); for (int i=1;i<=n;i++) bl[i]=(i-1)/blo+1; for (int i=1;i<=n;i++) { int opt=read(),l=read(),r=read();ll d=read(); if (opt==0) change(l,r,d); else printf("%lld\n",v[r]+tag[bl[r]]); } return 0; }