-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathacc3p4.cpp
75 lines (68 loc) · 1.84 KB
/
acc3p4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//
// Created by Aaron Zhu on 2021-07-18.
//
#include <iostream>
#include <vector>
#include <set>
#include <cmath>
#include <algorithm>
#include <functional>
#include <queue>
#include <cassert>
#define ll long long
#define pii pair<int, int>
#define boost() cin.tie(0); cin.sync_with_stdio(0)
#define scan(x) do{while((x=getchar())<'0'); for(x-='0'; '0'<=(_=getchar()); x=(x<<3)+(x<<1)+_-'0');}while(0)
char _;
using namespace std;
#define MAX 1000001
struct info {
int val;
int lazy;
};
info seg[MAX * 4];
int n, q, instruction, one, two, a;
void update(int node, int left, int right, int l, int r, int v) {
if (right < l || r < left) return;
if (l <= left && right <= r) {
seg[node].lazy = seg[node].lazy + v;
return;
}
int mid = (left + right) / 2;
update(node * 2, left, mid, l, r, v);
update(node * 2 + 1, mid + 1, right, l, r, v);
return;
}
int query(int node, int left, int right, int l, int r) {
if (seg[node].lazy != 0) {
seg[node].val += seg[node].lazy;
if (left != right) {
seg[2 * node].lazy += seg[node].lazy;
seg[2 * node + 1].lazy += seg[node].lazy;
}
seg[node].lazy = 0;
}
if (right < l || r < left) return 0;
if (l <= left && right <= r) return seg[node].val;
int mid = (left + right) / 2;
return query(node * 2, left, mid, l, r) + query(node * 2 + 1, mid + 1, right, l, r);
}
int main()
{
for (int i = 0; i < 4 * MAX; i += 1) {
seg[i].val = 0;
seg[i].lazy = 0;
}
scan(n); scan(q);
for (int i = 0; i < q; i += 1) {
scan(instruction);
if (instruction == 1) {
scan(one); scan(two); scan(a);
update(1, 0, n, one, two, a);
} else {
scan(one); scan(two);
cout << query(1, 0, n, one, two) << "\n";
}
}
return 0;
}