Skip to content

Commit 4451d18

Browse files
committed
winter trainning 10
1 parent f30bdac commit 4451d18

File tree

9 files changed

+868
-0
lines changed

9 files changed

+868
-0
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
#include <cstdio>
2+
3+
using namespace std;
4+
5+
int n, m;
6+
7+
const int N = 1e6 + 5;
8+
9+
typedef long long LL;
10+
11+
LL arr[N];
12+
13+
struct Node {
14+
LL sumv;
15+
LL addv;
16+
};
17+
18+
struct SegTree {
19+
Node a[4 * N];
20+
LL* arr;
21+
LL sumtr;
22+
int QL, QR;
23+
int L, R;
24+
25+
void pushdown(int id) {
26+
int lc = id * 2, rc = id * 2 + 1;
27+
a[lc].addv += a[id].addv;
28+
a[rc].addv += a[id].addv;
29+
a[id].addv = 0;
30+
}
31+
32+
void maintain(int id, int l, int r) {
33+
int lc = id * 2, rc = id * 2 + 1;
34+
if (l != r) {
35+
a[id].sumv = a[lc].sumv + a[rc].sumv;
36+
}
37+
a[id].sumv += a[id].addv * (r - l + 1);
38+
if (l == r) a[id].addv = 0;
39+
}
40+
41+
void _build(int id, int l, int r) {
42+
a[id].sumv = a[id].addv = 0;
43+
if (l == r) {
44+
a[id].sumv = arr[l];
45+
} else {
46+
int m = l + (r - l) / 2;
47+
_build(id * 2, l, m);
48+
_build(id * 2 + 1, m + 1, r);
49+
maintain(id, l, r);
50+
}
51+
}
52+
void build(int l, int r, LL* _arr) {
53+
arr = _arr;
54+
L = l;
55+
R = r;
56+
_build(1, L, R);
57+
}
58+
59+
void _add(int id, int l, int r, LL val) {
60+
if (QL <= l && r <= QR) {
61+
a[id].addv += val;
62+
} else {
63+
pushdown(id);
64+
int m = l + (r - l) / 2;
65+
if (QL <= m)
66+
_add(id * 2, l, m, val);
67+
else
68+
maintain(id * 2, l, m);
69+
70+
if (m + 1 <= QR)
71+
_add(id * 2 + 1, m + 1, r, val);
72+
else
73+
maintain(id * 2 + 1, m + 1, r);
74+
}
75+
maintain(id, l, r);
76+
}
77+
void add(int l, int r, LL val) {
78+
QL = l, QR = r;
79+
_add(1, L, R, val);
80+
}
81+
82+
void _query(int id, int l, int r) {
83+
maintain(id, l, r);
84+
if (QL <= l && r <= QR) {
85+
sumtr += a[id].sumv;
86+
} else {
87+
int m = l + (r - l) / 2;
88+
pushdown(id);
89+
if (QL <= m)
90+
_query(id * 2, l, m);
91+
else
92+
maintain(id * 2, l, m);
93+
94+
if (m + 1 <= QR)
95+
_query(id * 2 + 1, m + 1, r);
96+
else
97+
maintain(id * 2 + 1, m + 1, r);
98+
}
99+
}
100+
LL query(int l, int r) {
101+
sumtr = 0;
102+
QL = l, QR = r;
103+
_query(1, L, R);
104+
return sumtr;
105+
}
106+
};
107+
108+
SegTree tree;
109+
110+
int main() {
111+
#ifdef D
112+
freopen("3372.in", "r", stdin);
113+
#endif
114+
scanf("%d%d", &n, &m);
115+
for (int i = 1; i <= n; i++) {
116+
scanf("%lld", arr + i);
117+
}
118+
tree.build(1, n, arr);
119+
for (int i = 0; i < m; i++) {
120+
int type, l, r, val;
121+
scanf("%d%d%d", &type, &l, &r);
122+
if (type == 1) {
123+
scanf("%d", &val);
124+
tree.add(l, r, val);
125+
} else {
126+
LL ans = tree.query(l, r);
127+
printf("%lld\n", ans);
128+
}
129+
}
130+
131+
return 0;
132+
}
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
#include <algorithm>
2+
#include <cstdio>
3+
#include <vector>
4+
5+
using namespace std;
6+
7+
typedef long long LL;
8+
9+
struct Letter {
10+
LL c, d;
11+
void in() {
12+
int MM, mm, hh, dd;
13+
scanf("%lld %d.%d %d:%d", &c, &dd, &MM, &hh, &mm);
14+
d = mm + 63 * (hh + 29 * (dd + 31 * MM));
15+
}
16+
};
17+
18+
const int N = 100030;
19+
int n;
20+
vector<LL> ts;
21+
Letter ls[N];
22+
23+
int get(LL t) { return lower_bound(begin(ts), end(ts), t) - begin(ts) + 1; }
24+
25+
struct Node {
26+
LL setv, addv;
27+
LL maxv, minv, sumv;
28+
};
29+
struct SegTree {
30+
Node a[N * 4];
31+
int L, R;
32+
int QL, QR;
33+
LL sumtr, mintr, maxtr;
34+
LL val;
35+
36+
void pushdown(int id) {
37+
int lc = id * 2, rc = id * 2 + 1;
38+
if (a[id].setv >= 0) {
39+
a[lc].addv = a[rc].addv = 0;
40+
a[lc].setv = a[rc].setv = a[id].setv;
41+
a[id].setv = -1;
42+
}
43+
if (a[id].addv) {
44+
a[lc].addv += a[id].addv;
45+
a[rc].addv += a[id].addv;
46+
a[id].addv = 0;
47+
}
48+
}
49+
50+
void maintain(int id, int l, int r) {
51+
if (l != r) {
52+
int lc = id * 2, rc = id * 2 + 1;
53+
a[id].sumv = a[lc].sumv + a[rc].sumv;
54+
a[id].minv = min(a[lc].minv, a[rc].minv);
55+
a[id].maxv = max(a[lc].maxv, a[rc].maxv);
56+
}
57+
58+
if (a[id].setv >= 0) {
59+
a[id].sumv = (r - l + 1) * a[id].setv;
60+
a[id].minv = a[id].maxv = a[id].setv;
61+
}
62+
if (a[id].addv) {
63+
a[id].sumv += (r - l + 1) * a[id].addv;
64+
a[id].minv += a[id].addv;
65+
a[id].maxv += a[id].addv;
66+
}
67+
68+
if (l == r) {
69+
a[id].addv = 0;
70+
a[id].setv = -1;
71+
}
72+
}
73+
74+
void _build(int id, int l, int r) {
75+
a[id].setv = -1;
76+
a[id].minv = a[id].maxv = a[id].sumv = 0;
77+
if (l == r) {
78+
a[id].minv = a[id].maxv = a[id].sumv = 0;
79+
} else {
80+
int m = (l + r) / 2;
81+
_build(id * 2, l, m);
82+
_build(id * 2, m + 1, r);
83+
maintain(id, l, r);
84+
}
85+
}
86+
void build(int l, int r) {
87+
L = l, R = r;
88+
_build(1, L, R);
89+
}
90+
91+
void _add(int id, int l, int r) {
92+
if (QL <= l && r <= QR) {
93+
a[id].addv += val;
94+
// printf("[%d %d] of [%d %d] added by %lld\n", l, r, QL, QR, val);
95+
} else {
96+
pushdown(id);
97+
int m = (l + r) / 2;
98+
int lc = id * 2, rc = id * 2 + 1;
99+
if (QL <= m)
100+
_add(lc, l, m);
101+
else
102+
maintain(lc, l, m);
103+
104+
if (m + 1 <= QR)
105+
_add(rc, m + 1, r);
106+
else
107+
maintain(rc, m + 1, r);
108+
}
109+
maintain(id, l, r);
110+
}
111+
void add(int l, int r, LL _val) {
112+
QL = l, QR = r, val = _val;
113+
_add(1, L, R);
114+
}
115+
116+
void _set(int id, int l, int r) {
117+
if (QL <= l && r <= QR) {
118+
a[id].addv = 0;
119+
a[id].setv = val;
120+
// printf("[%d %d] of [%d %d] set to %lld\n", l, r, QL, QR, val);
121+
} else {
122+
pushdown(id);
123+
int m = (l + r) / 2;
124+
int lc = id * 2, rc = id * 2 + 1;
125+
if (QL <= m)
126+
_set(lc, l, m);
127+
else
128+
maintain(lc, l, m);
129+
130+
if (m + 1 <= QR)
131+
_set(rc, m + 1, r);
132+
else
133+
maintain(rc, m + 1, r);
134+
}
135+
maintain(id, l, r);
136+
}
137+
void set(int l, int r, LL _val) {
138+
QL = l, QR = r, val = _val;
139+
_set(1, L, R);
140+
}
141+
142+
void _query(int id, int l, int r) {
143+
maintain(id, l, r);
144+
if (QL <= l && r <= QR) {
145+
// printf("[%d %d] of [%d %d] queried, sum=%lld\n", l, r, QL, QR,
146+
// a[id].sumv);
147+
sumtr += a[id].sumv;
148+
mintr = min(mintr, a[id].minv);
149+
maxtr = max(maxtr, a[id].maxv);
150+
} else {
151+
pushdown(id);
152+
int m = (l + r) / 2;
153+
int lc = id * 2, rc = id * 2 + 1;
154+
if (QL <= m)
155+
_query(lc, l, m);
156+
else
157+
maintain(lc, l, m);
158+
159+
if (m + 1 <= QR)
160+
_query(rc, m + 1, r);
161+
else
162+
maintain(rc, m + 1, r);
163+
}
164+
}
165+
void query(int l, int r) {
166+
QL = l, QR = r;
167+
sumtr = 0;
168+
mintr = 1e18 + 1;
169+
maxtr = -1;
170+
_query(1, L, R);
171+
// printf("sum of [%d %d] is %lld\n", QL, QR, sumtr);
172+
}
173+
} tree;
174+
175+
int main() {
176+
#ifdef D
177+
freopen("c.in", "r", stdin);
178+
#endif
179+
scanf("%d", &n);
180+
for (int i = 0; i < n; i++) {
181+
ls[i].in();
182+
ts.push_back(ls[i].d);
183+
}
184+
185+
sort(begin(ts), end(ts));
186+
ts.erase(unique(begin(ts), end(ts)), end(ts));
187+
188+
tree.build(1, N);
189+
190+
for (int i = 0; i < n; i++) {
191+
int kth = get(ls[i].d);
192+
tree.add(kth, N, ls[i].c);
193+
tree.query(1, N);
194+
LL cur = tree.mintr;
195+
if (cur > 0) cur = 0;
196+
printf("%lld\n", cur);
197+
}
198+
199+
return 0;
200+
}

0 commit comments

Comments
 (0)