#include <bits/stdc++.h>
using namespace std;
#define int int64_t
struct seg {
int n;
vector<int> tree;
vector<int> lazy;
void push(int v) {
tree[v*2] += lazy[v];
tree[v*2+1] += lazy[v];
lazy[v*2] += lazy[v];
lazy[v*2+1] += lazy[v];
lazy[v] = 0;
}
int query(int v, int rl, int rr, int ql, int qr) {
if (ql > qr) {
return 0;
}
if (ql == rl && qr == rr) return tree[v];
push(v);
int rm = (rl + rr) / 2;
return max(query(v*2, rl, rm, ql, min(rm, qr)), query(v*2+1, rm+1, rr, max(rm+1, ql), qr));
}
void update(int v, int rl, int rr, int ql, int qr, int x) {
if (ql > qr) {
return;
}
if (ql == rl && qr == rr) {
tree[v] += x;
lazy[v] += x;
return;
}
push(v);
int rm = (rl + rr) / 2;
update(v*2, rl, rm, ql, min(rm, qr), x);
update(v*2+1, rm+1, rr, max(rm+1, ql), qr, x);
tree[v] = max(tree[v*2], tree[v*2+1]);
}
void init(int _n, vector<int> a) {
n = _n;
tree.assign(n*4, 0);
lazy.assign(n*4, 0);
for (int i = 0; i<n; i++) {
update(1, 0, n-1, i, i, a[i]);
}
}
};
vector<vector<int>> graph;
unordered_map<int, int> weight;
array<array<int, 100005>, 20> parent;
array<array<int, 100005>, 20> Size;
array<array<int, 100005>, 20> whichSubtree;
array<array<pair<int, int>, 100005>, 20> prepost;
vector<int> centroidLevel;
struct tree {
int level;
int currCol = 0;
seg segtree;
vector<int> order;
vector<int> verticies;
vector<int> children;
int dfs(int v, int p, int forbidden, int d) {
verticies.push_back(v);
prepost[level][v].first = order.size();
order.push_back(d);
parent[level][v] = p;
if (p!=-1) whichSubtree[level][v] = currCol;
int s = 1;
for (int i: graph[v]) {
if (i == p || centroidLevel[i]!=-1) continue;
s += dfs(i, v, forbidden, d+weight[i+v*100005]);
if (p==-1) {
children.push_back(i);
currCol++;
}
}
Size[level][v] = s;
prepost[level][v].second = order.size()-1;
return s;
}
bool isCentroid(int v, int p, int forbidden) {
int s = 1;
for (int i: graph[v]) {
if (i == p || centroidLevel[i]!=-1) continue;
if (Size[level][i] > (int)verticies.size()/2) return 0;
s += Size[level][i];
}
return (int)verticies.size()-s <= (int)verticies.size()/2;
}
int findCentroid(int v, int p, int forbidden) {
if (isCentroid(v, p, forbidden)) return v;
int biggest=0;
int indBiggest=-1;
for (int i: graph[v]) {
if (i == p || centroidLevel[i]!=-1) continue;
if (Size[level][i] > biggest) {
biggest = Size[level][i];
indBiggest = i;
}
}
assert(indBiggest!=-1);
return findCentroid(indBiggest, v, forbidden);
}
bool isParent(int p, int v) {
return (parent[level][v] == p);
}
set<pair<int, int>> bestInChild;
void updateEdge(int u, int v, int x) {
// if (verticies.count(u)==0 || verticies.count(v)==0) return;
if (!isParent(u, v)) swap(u, v);
int child = whichSubtree[level][v];
pair<int, int> rangeChild = prepost[level][children[child]];
bestInChild.erase({segtree.query(1, 0, segtree.n-1, rangeChild.first, rangeChild.second), child});
pair<int, int> rangeUpdate = prepost[level][v];
segtree.update(1, 0, segtree.n-1, rangeUpdate.first, rangeUpdate.second, x);
bestInChild.insert({segtree.query(1, 0, segtree.n-1, rangeChild.first, rangeChild.second), child});
}
int getDiam() {
if (bestInChild.empty()) return 0;
if (bestInChild.size()==1) return (*bestInChild.rbegin()).first;
return (*bestInChild.rbegin()).first + (*next(bestInChild.rbegin())).first;
}
pair<int, vector<int>> init(int v, int _level, int forbidden) {
level = _level;
currCol = 0;
order.clear();
dfs(v, -1, forbidden, 0);
int centroid = findCentroid(v, -1, forbidden);
currCol = 0;
order.clear();
verticies.clear();
children.clear();
dfs(centroid, -1, forbidden, 0);
// for (int i: order) cerr << i << " ";
// cerr << "\n";
segtree.init(order.size(), order);
for (int i = 0; i<(int)children.size(); i++) {
auto range = prepost[level][children[i]];
bestInChild.insert({segtree.query(1, 0, segtree.n-1, range.first, range.second), i});
}
return {centroid, children};
}
};
int N, Q, W;
vector<tree> trees;
vector<vector<int>> inTrees;
set<pair<int, int>> allDiams; // len, treeInd
void makeTrees() {
queue<array<int, 3>> q; // centroid, level, parent;
q.push({0, 0, -1});
while (q.size()) {
tree x;
auto newComps = x.init(q.front()[0], q.front()[1], q.front()[2]);
centroidLevel[newComps.first] = q.front()[1];
for (int i: newComps.second) {
q.push({i, q.front()[1]+1, newComps.first});
}
q.pop();
for (int i: x.verticies) inTrees[i].push_back(trees.size());
allDiams.insert({x.getDiam(), trees.size()});
trees.push_back(x);
}
}
void updateEdge(int u, int v, int x) {
int p1 = 0;
int p2 = 0;
while (p1<(int)inTrees[u].size() && p2<(int)inTrees[v].size()) {
if (inTrees[u][p1] == inTrees[v][p2]) {
allDiams.erase({trees[inTrees[u][p1]].getDiam(), inTrees[u][p1]});
trees[inTrees[u][p1]].updateEdge(u, v, x);
allDiams.insert({trees[inTrees[u][p1]].getDiam(), inTrees[u][p1]});
p1++;
p2++;
continue;
}
if (inTrees[u][p1] < inTrees[v][p2]) {
p1++;
continue;
}
p2++;
}
}
int queryBest() {
return (*allDiams.rbegin()).first;
}
signed main() {
cin.tie(0);
ios_base::sync_with_stdio(0);
cin >> N >> Q >> W;
graph.resize(N);
inTrees.resize(N);
centroidLevel.assign(N, -1);
vector<array<int,3>> edges(N-1);
for (int i = 0; i<N-1; i++) {
int a, b, c; cin >> a >> b >> c; a--; b--;
edges[i] = {a, b, c};
graph[a].push_back(b);
graph[b].push_back(a);
weight[a+b*100005] = c;
weight[b+a*100005] = c;
}
makeTrees();
// for (auto i: edges) {
// updateEdge(i[0], i[1], i[2]);
// }
int last = 0;
for (int i = 0; i<Q; i++) {
int _d, _e; cin >> _d >> _e;
int d = (_d+last)%(N-1);
int e = (_e+last)%(W);
int diff = e-edges[d][2];
updateEdge(edges[d][0], edges[d][1], diff);
edges[d][2] = e;
last = queryBest();
cout << last << "\n";
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Correct |
1 ms |
340 KB |
Output is correct |
4 |
Correct |
0 ms |
340 KB |
Output is correct |
5 |
Correct |
1 ms |
340 KB |
Output is correct |
6 |
Correct |
1 ms |
464 KB |
Output is correct |
7 |
Correct |
1 ms |
468 KB |
Output is correct |
8 |
Correct |
1 ms |
468 KB |
Output is correct |
9 |
Correct |
1 ms |
468 KB |
Output is correct |
10 |
Correct |
1 ms |
468 KB |
Output is correct |
11 |
Correct |
1 ms |
468 KB |
Output is correct |
12 |
Correct |
1 ms |
468 KB |
Output is correct |
13 |
Correct |
1 ms |
596 KB |
Output is correct |
14 |
Correct |
1 ms |
596 KB |
Output is correct |
15 |
Correct |
1 ms |
596 KB |
Output is correct |
16 |
Correct |
1 ms |
596 KB |
Output is correct |
17 |
Correct |
1 ms |
596 KB |
Output is correct |
18 |
Correct |
1 ms |
596 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Correct |
1 ms |
340 KB |
Output is correct |
4 |
Correct |
0 ms |
340 KB |
Output is correct |
5 |
Correct |
1 ms |
340 KB |
Output is correct |
6 |
Correct |
1 ms |
464 KB |
Output is correct |
7 |
Correct |
1 ms |
468 KB |
Output is correct |
8 |
Correct |
1 ms |
468 KB |
Output is correct |
9 |
Correct |
1 ms |
468 KB |
Output is correct |
10 |
Correct |
1 ms |
468 KB |
Output is correct |
11 |
Correct |
1 ms |
468 KB |
Output is correct |
12 |
Correct |
1 ms |
468 KB |
Output is correct |
13 |
Correct |
1 ms |
596 KB |
Output is correct |
14 |
Correct |
1 ms |
596 KB |
Output is correct |
15 |
Correct |
1 ms |
596 KB |
Output is correct |
16 |
Correct |
1 ms |
596 KB |
Output is correct |
17 |
Correct |
1 ms |
596 KB |
Output is correct |
18 |
Correct |
1 ms |
596 KB |
Output is correct |
19 |
Correct |
19 ms |
2064 KB |
Output is correct |
20 |
Correct |
20 ms |
2132 KB |
Output is correct |
21 |
Correct |
24 ms |
2260 KB |
Output is correct |
22 |
Correct |
25 ms |
2516 KB |
Output is correct |
23 |
Correct |
38 ms |
8524 KB |
Output is correct |
24 |
Correct |
50 ms |
9932 KB |
Output is correct |
25 |
Correct |
55 ms |
10796 KB |
Output is correct |
26 |
Correct |
54 ms |
12108 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
1 ms |
340 KB |
Output is correct |
3 |
Correct |
1 ms |
340 KB |
Output is correct |
4 |
Correct |
11 ms |
468 KB |
Output is correct |
5 |
Correct |
51 ms |
744 KB |
Output is correct |
6 |
Correct |
1 ms |
340 KB |
Output is correct |
7 |
Correct |
1 ms |
724 KB |
Output is correct |
8 |
Correct |
1 ms |
852 KB |
Output is correct |
9 |
Correct |
3 ms |
724 KB |
Output is correct |
10 |
Correct |
16 ms |
852 KB |
Output is correct |
11 |
Correct |
76 ms |
1228 KB |
Output is correct |
12 |
Correct |
8 ms |
5068 KB |
Output is correct |
13 |
Correct |
9 ms |
5068 KB |
Output is correct |
14 |
Correct |
10 ms |
5068 KB |
Output is correct |
15 |
Correct |
36 ms |
5088 KB |
Output is correct |
16 |
Correct |
125 ms |
5068 KB |
Output is correct |
17 |
Correct |
216 ms |
87048 KB |
Output is correct |
18 |
Correct |
261 ms |
86872 KB |
Output is correct |
19 |
Correct |
218 ms |
86880 KB |
Output is correct |
20 |
Correct |
260 ms |
87144 KB |
Output is correct |
21 |
Correct |
470 ms |
87540 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
2132 KB |
Output is correct |
2 |
Correct |
28 ms |
2260 KB |
Output is correct |
3 |
Correct |
124 ms |
2476 KB |
Output is correct |
4 |
Correct |
250 ms |
2660 KB |
Output is correct |
5 |
Correct |
45 ms |
22100 KB |
Output is correct |
6 |
Correct |
91 ms |
22100 KB |
Output is correct |
7 |
Correct |
257 ms |
21964 KB |
Output is correct |
8 |
Correct |
538 ms |
22096 KB |
Output is correct |
9 |
Correct |
269 ms |
118140 KB |
Output is correct |
10 |
Correct |
331 ms |
118140 KB |
Output is correct |
11 |
Correct |
683 ms |
118392 KB |
Output is correct |
12 |
Correct |
1116 ms |
118788 KB |
Output is correct |
13 |
Correct |
644 ms |
247136 KB |
Output is correct |
14 |
Correct |
714 ms |
247268 KB |
Output is correct |
15 |
Correct |
1156 ms |
247512 KB |
Output is correct |
16 |
Correct |
1695 ms |
247712 KB |
Output is correct |
17 |
Correct |
3205 ms |
247796 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2878 ms |
218476 KB |
Output is correct |
2 |
Correct |
2943 ms |
223236 KB |
Output is correct |
3 |
Correct |
2949 ms |
219684 KB |
Output is correct |
4 |
Correct |
2946 ms |
224252 KB |
Output is correct |
5 |
Correct |
2958 ms |
215316 KB |
Output is correct |
6 |
Correct |
2429 ms |
183844 KB |
Output is correct |
7 |
Correct |
3656 ms |
260704 KB |
Output is correct |
8 |
Correct |
3736 ms |
260576 KB |
Output is correct |
9 |
Correct |
3703 ms |
260728 KB |
Output is correct |
10 |
Correct |
3646 ms |
260128 KB |
Output is correct |
11 |
Correct |
3670 ms |
252460 KB |
Output is correct |
12 |
Correct |
3187 ms |
207168 KB |
Output is correct |
13 |
Correct |
3998 ms |
281236 KB |
Output is correct |
14 |
Correct |
3736 ms |
281148 KB |
Output is correct |
15 |
Correct |
4181 ms |
281176 KB |
Output is correct |
16 |
Correct |
4178 ms |
280416 KB |
Output is correct |
17 |
Correct |
3904 ms |
274388 KB |
Output is correct |
18 |
Correct |
3157 ms |
218368 KB |
Output is correct |
19 |
Correct |
3935 ms |
285184 KB |
Output is correct |
20 |
Correct |
3914 ms |
285244 KB |
Output is correct |
21 |
Correct |
4000 ms |
285256 KB |
Output is correct |
22 |
Correct |
3864 ms |
284360 KB |
Output is correct |
23 |
Correct |
4013 ms |
274308 KB |
Output is correct |
24 |
Correct |
3372 ms |
218352 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Correct |
1 ms |
340 KB |
Output is correct |
4 |
Correct |
0 ms |
340 KB |
Output is correct |
5 |
Correct |
1 ms |
340 KB |
Output is correct |
6 |
Correct |
1 ms |
464 KB |
Output is correct |
7 |
Correct |
1 ms |
468 KB |
Output is correct |
8 |
Correct |
1 ms |
468 KB |
Output is correct |
9 |
Correct |
1 ms |
468 KB |
Output is correct |
10 |
Correct |
1 ms |
468 KB |
Output is correct |
11 |
Correct |
1 ms |
468 KB |
Output is correct |
12 |
Correct |
1 ms |
468 KB |
Output is correct |
13 |
Correct |
1 ms |
596 KB |
Output is correct |
14 |
Correct |
1 ms |
596 KB |
Output is correct |
15 |
Correct |
1 ms |
596 KB |
Output is correct |
16 |
Correct |
1 ms |
596 KB |
Output is correct |
17 |
Correct |
1 ms |
596 KB |
Output is correct |
18 |
Correct |
1 ms |
596 KB |
Output is correct |
19 |
Correct |
19 ms |
2064 KB |
Output is correct |
20 |
Correct |
20 ms |
2132 KB |
Output is correct |
21 |
Correct |
24 ms |
2260 KB |
Output is correct |
22 |
Correct |
25 ms |
2516 KB |
Output is correct |
23 |
Correct |
38 ms |
8524 KB |
Output is correct |
24 |
Correct |
50 ms |
9932 KB |
Output is correct |
25 |
Correct |
55 ms |
10796 KB |
Output is correct |
26 |
Correct |
54 ms |
12108 KB |
Output is correct |
27 |
Correct |
1 ms |
340 KB |
Output is correct |
28 |
Correct |
1 ms |
340 KB |
Output is correct |
29 |
Correct |
1 ms |
340 KB |
Output is correct |
30 |
Correct |
11 ms |
468 KB |
Output is correct |
31 |
Correct |
51 ms |
744 KB |
Output is correct |
32 |
Correct |
1 ms |
340 KB |
Output is correct |
33 |
Correct |
1 ms |
724 KB |
Output is correct |
34 |
Correct |
1 ms |
852 KB |
Output is correct |
35 |
Correct |
3 ms |
724 KB |
Output is correct |
36 |
Correct |
16 ms |
852 KB |
Output is correct |
37 |
Correct |
76 ms |
1228 KB |
Output is correct |
38 |
Correct |
8 ms |
5068 KB |
Output is correct |
39 |
Correct |
9 ms |
5068 KB |
Output is correct |
40 |
Correct |
10 ms |
5068 KB |
Output is correct |
41 |
Correct |
36 ms |
5088 KB |
Output is correct |
42 |
Correct |
125 ms |
5068 KB |
Output is correct |
43 |
Correct |
216 ms |
87048 KB |
Output is correct |
44 |
Correct |
261 ms |
86872 KB |
Output is correct |
45 |
Correct |
218 ms |
86880 KB |
Output is correct |
46 |
Correct |
260 ms |
87144 KB |
Output is correct |
47 |
Correct |
470 ms |
87540 KB |
Output is correct |
48 |
Correct |
6 ms |
2132 KB |
Output is correct |
49 |
Correct |
28 ms |
2260 KB |
Output is correct |
50 |
Correct |
124 ms |
2476 KB |
Output is correct |
51 |
Correct |
250 ms |
2660 KB |
Output is correct |
52 |
Correct |
45 ms |
22100 KB |
Output is correct |
53 |
Correct |
91 ms |
22100 KB |
Output is correct |
54 |
Correct |
257 ms |
21964 KB |
Output is correct |
55 |
Correct |
538 ms |
22096 KB |
Output is correct |
56 |
Correct |
269 ms |
118140 KB |
Output is correct |
57 |
Correct |
331 ms |
118140 KB |
Output is correct |
58 |
Correct |
683 ms |
118392 KB |
Output is correct |
59 |
Correct |
1116 ms |
118788 KB |
Output is correct |
60 |
Correct |
644 ms |
247136 KB |
Output is correct |
61 |
Correct |
714 ms |
247268 KB |
Output is correct |
62 |
Correct |
1156 ms |
247512 KB |
Output is correct |
63 |
Correct |
1695 ms |
247712 KB |
Output is correct |
64 |
Correct |
3205 ms |
247796 KB |
Output is correct |
65 |
Correct |
2878 ms |
218476 KB |
Output is correct |
66 |
Correct |
2943 ms |
223236 KB |
Output is correct |
67 |
Correct |
2949 ms |
219684 KB |
Output is correct |
68 |
Correct |
2946 ms |
224252 KB |
Output is correct |
69 |
Correct |
2958 ms |
215316 KB |
Output is correct |
70 |
Correct |
2429 ms |
183844 KB |
Output is correct |
71 |
Correct |
3656 ms |
260704 KB |
Output is correct |
72 |
Correct |
3736 ms |
260576 KB |
Output is correct |
73 |
Correct |
3703 ms |
260728 KB |
Output is correct |
74 |
Correct |
3646 ms |
260128 KB |
Output is correct |
75 |
Correct |
3670 ms |
252460 KB |
Output is correct |
76 |
Correct |
3187 ms |
207168 KB |
Output is correct |
77 |
Correct |
3998 ms |
281236 KB |
Output is correct |
78 |
Correct |
3736 ms |
281148 KB |
Output is correct |
79 |
Correct |
4181 ms |
281176 KB |
Output is correct |
80 |
Correct |
4178 ms |
280416 KB |
Output is correct |
81 |
Correct |
3904 ms |
274388 KB |
Output is correct |
82 |
Correct |
3157 ms |
218368 KB |
Output is correct |
83 |
Correct |
3935 ms |
285184 KB |
Output is correct |
84 |
Correct |
3914 ms |
285244 KB |
Output is correct |
85 |
Correct |
4000 ms |
285256 KB |
Output is correct |
86 |
Correct |
3864 ms |
284360 KB |
Output is correct |
87 |
Correct |
4013 ms |
274308 KB |
Output is correct |
88 |
Correct |
3372 ms |
218352 KB |
Output is correct |
89 |
Correct |
3130 ms |
224476 KB |
Output is correct |
90 |
Correct |
3513 ms |
241956 KB |
Output is correct |
91 |
Correct |
3972 ms |
258580 KB |
Output is correct |
92 |
Correct |
4385 ms |
262748 KB |
Output is correct |
93 |
Correct |
4048 ms |
271308 KB |
Output is correct |
94 |
Correct |
3986 ms |
273148 KB |
Output is correct |
95 |
Correct |
3786 ms |
280796 KB |
Output is correct |
96 |
Correct |
3845 ms |
278912 KB |
Output is correct |
97 |
Correct |
3748 ms |
280504 KB |
Output is correct |
98 |
Correct |
3827 ms |
284320 KB |
Output is correct |
99 |
Correct |
3873 ms |
280116 KB |
Output is correct |
100 |
Correct |
3848 ms |
280040 KB |
Output is correct |