冲着这个智慧的数字"⑨"就值得一写。

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 }
AC代码

相关文章: