|
- 加法标记,表示对整个区间的所有数加上标记值。于是做法就很简单了注意分块大小 sqrt( n/3 )较优 。
-
#include<bits/stdc++.h> using namespace std; #define maxn 56789 int n,a[maxn],l,r,j; int op,big,b[1333],c; int main() { scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d",&a[i]); big=sqrt(n/3); for(int i=0; i<n; i++) { scanf("%d%d%d%d",&op,&l,&r,&c); l--,r--; if(op==1)printf("%d\n",a[r]+b[r/big]); else { for(j=l;j<=r&&j%big; j++)a[j]+=c; for(; j+big-1<=r; j+=big)b[j/big]+=c; for(; j<=r; j++)a[j]+=c; } } return 0; }