冲着这个智慧的数字"⑨"就值得一写。
T1,区间加,单点查。
打个标记就行了。
1 #include <cstdio> 2 #include <cmath> 3 4 const int N = 50010; 5 6 int le[N], re[N], sum[N], tag[N], a[N], fr[N]; 7 8 inline void add(int x, int y, int c) { 9 int l = fr[x], r = fr[y]; 10 if(l == r) { 11 for(int i = x; i <= y; i++) { 12 a[i] += c; 13 sum[r] += c; 14 } 15 return; 16 } 17 for(int i = l + 1; i < r; i++) { 18 sum[i] += c * (re[i] - le[i] + 1); 19 tag[i] += c; 20 } 21 for(int i = x; i <= re[l]; i++) { 22 a[i] += c; 23 sum[l] += c; 24 } 25 for(int i = le[r]; i <= y; i++) { 26 a[i] += c; 27 sum[r] += c; 28 } 29 return; 30 } 31 32 inline int ask(int x) { 33 return a[x] + tag[fr[x]]; 34 } 35 36 int main() { 37 int n; 38 scanf("%d", &n); 39 for(int i = 1; i <= n; i++) { 40 scanf("%d", &a[i]); 41 } 42 int T = sqrt(n); 43 for(int i = 1; i <= T; i++) { 44 le[i] = T * (i - 1) + 1; 45 re[i] = T * i; 46 for(int j = le[i]; j <= re[i]; j++) { 47 fr[j] = i; 48 sum[i] += a[j]; 49 } 50 } 51 if(re[T] < n) { 52 T++; 53 le[T] = re[T - 1] + 1; 54 re[T] = n; 55 for(int i = le[T]; i <= n; i++) { 56 sum[T] += a[i]; 57 fr[i] = T; 58 } 59 } 60 61 for(int i = 1, f, x, y, z; i <= n; i++) { 62 scanf("%d%d%d%d", &f, &x, &y, &z); 63 if(f == 0) { 64 add(x, y, z); 65 } 66 else { 67 int t = ask(y); 68 printf("%d\n", t); 69 } 70 } 71 72 return 0; 73 }