#pragma GCC optimize("O3")
#pragma GCC target("sse4")
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define gc getchar_unlocked()
#define pc(x) putchar_unlocked(x)
template<typename T> void scan(T &x){x = 0;bool _=0;T c=gc;_=c==45;c=_?gc:c;while(c<48||c>57)c=gc;for(;c<48||c>57;c=gc);for(;c>47&&c<58;c=gc)x=(x<<3)+(x<<1)+(c&15);x=_?-x:x;}
template<typename T> void printn(T n){bool _=0;_=n<0;n=_?-n:n;char snum[65];int i=0;do{snum[i++]=n%10+48;n/= 10;}while(n);--i;if (_)pc(45);while(i>=0)pc(snum[i--]);}
template<typename First, typename ... Ints> void scan(First &arg, Ints&... rest){scan(arg);scan(rest...);}
template<typename T> void print(T n){printn(n);pc(10);}
template<typename First, typename ... Ints> void print(First arg, Ints... rest){printn(arg);pc(32);print(rest...);}
typedef long long ll;
typedef long long T;
constexpr int MM = 1e5+2, LOG = 17;
int n, q, tot, sz[MM], a[MM], b[MM], dep[LOG][MM], in[LOG][MM], out[LOG][MM], t[LOG], centid[LOG][MM], parid[LOG][MM];
ll maxw, c[MM];
std::vector<std::pair<int, ll>> adj[MM];
bool vis[MM];
//all best, ch set for each node as centroid
struct Combine {
using Data = ll;
using Lazy = ll;
const Data qdef = 0;
const Lazy ldef = 0;
Data merge(const Data &l, const Data &r) const { return std::max(l, r); }
Data applyLazy(const Data &l, const Lazy &r) const { return l + r; }
Lazy getSegmentVal(const Lazy &v, int k) const { return v; }
Lazy mergeLazy(const Lazy &l, const Lazy &r) const { return l + r; }
};
struct Combine2{
using Data = std::pair<ll, ll>;
using Lazy = std::pair<ll, ll>;
const Data qdef = {0LL, 0LL};
Data merge(const Data &l, const Data &r) const {
if(l.first > r.first)
return {l.first, std::max(l.second, r.first)};
return {r.first, std::max(r.second, l.first)};
}
Data applyLazy(const Data &l, const Lazy &r) const {
return r;
}
};
template <class Combine> struct SegmentTreeLazyBottomUp {
using Data = typename Combine::Data; using Lazy = typename Combine::Lazy;
Combine C; int N, lgN; std::vector<Data> TR; std::vector<Lazy> LZ;
void apply(int i, const Lazy &v, int k) {
TR[i] = C.applyLazy(TR[i], C.getSegmentVal(v, k));
if (i < N) LZ[i] = C.mergeLazy(LZ[i], v);
}
void pushup(int i) {
for (int k = 2; i /= 2; k *= 2) {
TR[i] = C.merge(TR[i * 2], TR[i * 2 + 1]);
if (LZ[i] != C.ldef)
TR[i] = C.applyLazy(TR[i], C.getSegmentVal(LZ[i], k));
}
}
void propagate(int i) {
int h = lgN + 1, k = 1 << lgN, ii = i >> h;
for (; h > 0; ii = i >> --h, k /= 2) if (LZ[ii] != C.ldef) {
apply(ii * 2, LZ[ii], k); apply(ii * 2 + 1, LZ[ii], k); LZ[ii] = C.ldef;
}
}
void init(int n0, const Data vdef) {
N = n0;
lgN = std::__lg(N);
TR = std::vector<Data>(N * 2, C.qdef);
LZ = std::vector<Lazy>(N, C.ldef);
fill(TR.begin() + N, TR.end(), vdef);
for (int i = N - 1; i > 0; i--) TR[i] = C.merge(TR[i * 2], TR[i * 2 + 1]);
}
void update(int l, int r, const Lazy &v) {
int l0 = l += N, r0 = r += N, k = 1; propagate(l); propagate(r);
for (; l <= r; l /= 2, r /= 2, k *= 2) {
if (l & 1) apply(l++, v, k);
if (!(r & 1)) apply(r--, v, k);
}
pushup(l0); pushup(r0);
}
Data query(int l, int r) {
propagate(l += N); propagate(r += N); Data ql = C.qdef, qr = C.qdef;
for (; l <= r; l /= 2, r /= 2) {
if (l & 1) ql = C.merge(ql, TR[l++]);
if (!(r & 1)) qr = C.merge(TR[r--], qr);
}
return C.merge(ql, qr);
}
};
template <class Combine> struct SegmentTreeBottomUp {
using Data = typename Combine::Data; using Lazy = typename Combine::Lazy;
Combine C; int N; std::vector<Data> TR;
void init(int N0, const Data &vdef) {
N = N0;
TR = std::vector<Data>(N * 2, C.qdef);
fill(TR.begin() + N, TR.end(), vdef);
for (int i = N - 1; i > 0; i--)
TR[i] = C.merge(TR[i * 2], TR[i * 2 + 1]);
}
void update(int i, const Lazy &v) {
for (i += N, TR[i] = C.applyLazy(TR[i], v); i /= 2;)
TR[i] = C.merge(TR[i * 2], TR[i * 2 + 1]);
}
Data query(int l, int r) {
Data ql = C.qdef, qr = C.qdef;
for (l += N, r += N; l <= r; l /= 2, r /= 2) {
if (l & 1) ql = C.merge(ql, TR[l++]);
if (!(r & 1)) qr = C.merge(TR[r--], qr);
}
return C.merge(ql, qr);
}
};
SegmentTreeLazyBottomUp<Combine> ST[LOG];
SegmentTreeBottomUp<Combine2> BEST, CH[LOG];
int getsz(int cur, int pre){
sz[cur] = 1;
for(auto e: adj[cur]){
int u = e.first;
if(u != pre && !vis[u])
sz[cur] += getsz(u, cur);
}
return sz[cur];
}
int findcent(int cur, int pre){
for(auto e: adj[cur]){
int u = e.first;
if(!vis[u] && u != pre && sz[u]*2 > tot)
return findcent(u, cur);
}
return cur;
}
void dfs1(int cur, int pre, int lvl, int cent, ll w){
in[lvl][cur] = ++t[lvl];
dep[lvl][cur] = dep[lvl][pre]+1;
centid[lvl][cur] = cent;
parid[lvl][cur] = pre == cent ? cur : parid[lvl][pre];
for(auto u: adj[cur]){
if(u.first == pre || vis[u.first])
continue;
dfs1(u.first, cur, lvl, cent, u.second);
}
out[lvl][cur] = t[lvl];
ST[lvl].update(in[lvl][cur], out[lvl][cur], w);
}
void go(int root, int lvl){
getsz(root, -1);
tot = sz[root];
if(tot == 1)
return;
int cent = findcent(root, -1);
vis[cent] = 1;
dfs1(cent, 0, lvl, cent, 0);
for(auto u: adj[cent]){
if(vis[u.first])
continue;
int st = in[lvl][u.first], ed = out[lvl][u.first];
ll v = ST[lvl].query(st, ed);
CH[lvl].update(in[lvl][u.first], {v, 0LL});
// print(lvl, u.first, v);
// ch[cent].insert(v);
}
// while(ch[cent].size() < 2)
// ch[cent].insert(0);
// auto ptr = ch[cent].begin();
// best.insert(*ptr + *++ptr);
auto tmp = CH[lvl].query(in[lvl][cent], out[lvl][cent]);
// print(in[lvl][cent], out[lvl][cent]);
// print(tmp.first, tmp.second);
BEST.update(cent, {tmp.first+tmp.second, 0LL});
for(auto u: adj[cent]){
if(!vis[u.first])
go(u.first, lvl+1);
}
}
int main(){
scan(n, q, maxw);
for(int i = 0; i < n-1; i++){
scan(a[i], b[i], c[i]);
adj[a[i]].emplace_back(b[i], c[i]);
adj[b[i]].emplace_back(a[i], c[i]);
}
for(int i = 0; i < LOG; i++){
ST[i].init(MM, 0);
CH[i].init(MM, {0, 0});
}
BEST.init(MM, {0, 0});
go(1, 0);
ll d, e, last = 0;
while(q--){
scan(d, e);
d = (d+last)%(n-1);
e = (e+last)%maxw;
int aa = a[d], bb = b[d];
ll dif = e-c[d];
c[d] = e;
for(int i = 0; i < LOG; i++){
int cent = centid[i][aa];
if(cent and cent == centid[i][bb]){
if(dep[i][aa] < dep[i][bb])
std::swap(aa, bb);
//aa is deeper, update it
// auto ptr = ch[cent].begin();
// best.erase(best.lower_bound(*ptr + *++ptr));
int par = parid[i][aa];
// ch[cent].erase(ch[cent].lower_bound(ST[i].query(in[i][par], out[i][par])));
ST[i].update(in[i][aa], out[i][aa], dif);
// ch[cent].insert(ST[i].query(in[i][par], out[i][par]));]
ll v = ST[i].query(in[i][par], out[i][par]);
CH[i].update(in[i][par], {v, 0LL});
auto tmp = CH[i].query(in[i][cent], out[i][cent]);
BEST.update(cent, {tmp.first+tmp.second, 0LL});
// print(tmp.first, tmp.second);
// ptr = ch[cent].begin();
// best.insert(*ptr + *++ptr);
}
}
// print(last = *best.begin());
print(last = BEST.query(0, MM-1).first);
}
}
/*
* ett each centroid
* when update edge, loop through LOG levels
* if for any lvl, there is a point where centid[lvl][a] == centid[lvl][b] != 0, then update the one with higher depth
* then for its centid, remove old ans from multiset and insert new one
*
*/
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
57 ms |
99192 KB |
Output is correct |
2 |
Correct |
58 ms |
99064 KB |
Output is correct |
3 |
Correct |
57 ms |
99192 KB |
Output is correct |
4 |
Correct |
57 ms |
99192 KB |
Output is correct |
5 |
Correct |
65 ms |
99196 KB |
Output is correct |
6 |
Correct |
59 ms |
99064 KB |
Output is correct |
7 |
Correct |
60 ms |
99192 KB |
Output is correct |
8 |
Correct |
57 ms |
99192 KB |
Output is correct |
9 |
Correct |
57 ms |
99320 KB |
Output is correct |
10 |
Correct |
57 ms |
99320 KB |
Output is correct |
11 |
Correct |
58 ms |
99192 KB |
Output is correct |
12 |
Correct |
59 ms |
99192 KB |
Output is correct |
13 |
Correct |
58 ms |
99320 KB |
Output is correct |
14 |
Correct |
57 ms |
99192 KB |
Output is correct |
15 |
Correct |
60 ms |
99320 KB |
Output is correct |
16 |
Correct |
66 ms |
99192 KB |
Output is correct |
17 |
Correct |
58 ms |
99320 KB |
Output is correct |
18 |
Correct |
57 ms |
99320 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
57 ms |
99192 KB |
Output is correct |
2 |
Correct |
58 ms |
99064 KB |
Output is correct |
3 |
Correct |
57 ms |
99192 KB |
Output is correct |
4 |
Correct |
57 ms |
99192 KB |
Output is correct |
5 |
Correct |
65 ms |
99196 KB |
Output is correct |
6 |
Correct |
59 ms |
99064 KB |
Output is correct |
7 |
Correct |
60 ms |
99192 KB |
Output is correct |
8 |
Correct |
57 ms |
99192 KB |
Output is correct |
9 |
Correct |
57 ms |
99320 KB |
Output is correct |
10 |
Correct |
57 ms |
99320 KB |
Output is correct |
11 |
Correct |
58 ms |
99192 KB |
Output is correct |
12 |
Correct |
59 ms |
99192 KB |
Output is correct |
13 |
Correct |
58 ms |
99320 KB |
Output is correct |
14 |
Correct |
57 ms |
99192 KB |
Output is correct |
15 |
Correct |
60 ms |
99320 KB |
Output is correct |
16 |
Correct |
66 ms |
99192 KB |
Output is correct |
17 |
Correct |
58 ms |
99320 KB |
Output is correct |
18 |
Correct |
57 ms |
99320 KB |
Output is correct |
19 |
Correct |
81 ms |
99576 KB |
Output is correct |
20 |
Correct |
87 ms |
99576 KB |
Output is correct |
21 |
Correct |
87 ms |
99788 KB |
Output is correct |
22 |
Correct |
90 ms |
99704 KB |
Output is correct |
23 |
Correct |
90 ms |
100600 KB |
Output is correct |
24 |
Correct |
121 ms |
100856 KB |
Output is correct |
25 |
Correct |
123 ms |
101024 KB |
Output is correct |
26 |
Correct |
122 ms |
101240 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
67 ms |
99192 KB |
Output is correct |
2 |
Correct |
59 ms |
99192 KB |
Output is correct |
3 |
Correct |
61 ms |
99192 KB |
Output is correct |
4 |
Correct |
67 ms |
99192 KB |
Output is correct |
5 |
Correct |
117 ms |
99576 KB |
Output is correct |
6 |
Correct |
67 ms |
99192 KB |
Output is correct |
7 |
Correct |
57 ms |
99196 KB |
Output is correct |
8 |
Correct |
57 ms |
99192 KB |
Output is correct |
9 |
Correct |
59 ms |
99192 KB |
Output is correct |
10 |
Correct |
78 ms |
99320 KB |
Output is correct |
11 |
Correct |
117 ms |
99704 KB |
Output is correct |
12 |
Correct |
60 ms |
99576 KB |
Output is correct |
13 |
Correct |
60 ms |
99632 KB |
Output is correct |
14 |
Correct |
61 ms |
99576 KB |
Output is correct |
15 |
Correct |
80 ms |
99704 KB |
Output is correct |
16 |
Correct |
130 ms |
100088 KB |
Output is correct |
17 |
Correct |
110 ms |
107876 KB |
Output is correct |
18 |
Correct |
103 ms |
107748 KB |
Output is correct |
19 |
Correct |
105 ms |
107752 KB |
Output is correct |
20 |
Correct |
145 ms |
107876 KB |
Output is correct |
21 |
Correct |
238 ms |
108556 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
62 ms |
99576 KB |
Output is correct |
2 |
Correct |
85 ms |
99552 KB |
Output is correct |
3 |
Correct |
211 ms |
99976 KB |
Output is correct |
4 |
Correct |
331 ms |
100088 KB |
Output is correct |
5 |
Correct |
95 ms |
102392 KB |
Output is correct |
6 |
Correct |
144 ms |
102392 KB |
Output is correct |
7 |
Correct |
375 ms |
102636 KB |
Output is correct |
8 |
Correct |
589 ms |
102904 KB |
Output is correct |
9 |
Correct |
241 ms |
116220 KB |
Output is correct |
10 |
Correct |
343 ms |
116344 KB |
Output is correct |
11 |
Correct |
734 ms |
116732 KB |
Output is correct |
12 |
Correct |
1075 ms |
116900 KB |
Output is correct |
13 |
Correct |
453 ms |
134908 KB |
Output is correct |
14 |
Correct |
548 ms |
134776 KB |
Output is correct |
15 |
Correct |
949 ms |
135172 KB |
Output is correct |
16 |
Correct |
1452 ms |
135432 KB |
Output is correct |
17 |
Correct |
2729 ms |
135756 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2312 ms |
136320 KB |
Output is correct |
2 |
Correct |
2476 ms |
137436 KB |
Output is correct |
3 |
Correct |
2334 ms |
135864 KB |
Output is correct |
4 |
Correct |
2393 ms |
137708 KB |
Output is correct |
5 |
Correct |
2635 ms |
135796 KB |
Output is correct |
6 |
Correct |
2088 ms |
137284 KB |
Output is correct |
7 |
Correct |
3435 ms |
141992 KB |
Output is correct |
8 |
Correct |
3216 ms |
141828 KB |
Output is correct |
9 |
Correct |
3396 ms |
141856 KB |
Output is correct |
10 |
Correct |
3631 ms |
141856 KB |
Output is correct |
11 |
Correct |
3154 ms |
141428 KB |
Output is correct |
12 |
Correct |
2852 ms |
141560 KB |
Output is correct |
13 |
Correct |
3688 ms |
143548 KB |
Output is correct |
14 |
Correct |
3684 ms |
143364 KB |
Output is correct |
15 |
Correct |
3784 ms |
143652 KB |
Output is correct |
16 |
Correct |
4014 ms |
143432 KB |
Output is correct |
17 |
Correct |
3656 ms |
143384 KB |
Output is correct |
18 |
Correct |
3079 ms |
143092 KB |
Output is correct |
19 |
Correct |
3660 ms |
143468 KB |
Output is correct |
20 |
Correct |
3748 ms |
143440 KB |
Output is correct |
21 |
Correct |
3652 ms |
143488 KB |
Output is correct |
22 |
Correct |
3889 ms |
143516 KB |
Output is correct |
23 |
Correct |
3887 ms |
143416 KB |
Output is correct |
24 |
Correct |
3047 ms |
142952 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
57 ms |
99192 KB |
Output is correct |
2 |
Correct |
58 ms |
99064 KB |
Output is correct |
3 |
Correct |
57 ms |
99192 KB |
Output is correct |
4 |
Correct |
57 ms |
99192 KB |
Output is correct |
5 |
Correct |
65 ms |
99196 KB |
Output is correct |
6 |
Correct |
59 ms |
99064 KB |
Output is correct |
7 |
Correct |
60 ms |
99192 KB |
Output is correct |
8 |
Correct |
57 ms |
99192 KB |
Output is correct |
9 |
Correct |
57 ms |
99320 KB |
Output is correct |
10 |
Correct |
57 ms |
99320 KB |
Output is correct |
11 |
Correct |
58 ms |
99192 KB |
Output is correct |
12 |
Correct |
59 ms |
99192 KB |
Output is correct |
13 |
Correct |
58 ms |
99320 KB |
Output is correct |
14 |
Correct |
57 ms |
99192 KB |
Output is correct |
15 |
Correct |
60 ms |
99320 KB |
Output is correct |
16 |
Correct |
66 ms |
99192 KB |
Output is correct |
17 |
Correct |
58 ms |
99320 KB |
Output is correct |
18 |
Correct |
57 ms |
99320 KB |
Output is correct |
19 |
Correct |
81 ms |
99576 KB |
Output is correct |
20 |
Correct |
87 ms |
99576 KB |
Output is correct |
21 |
Correct |
87 ms |
99788 KB |
Output is correct |
22 |
Correct |
90 ms |
99704 KB |
Output is correct |
23 |
Correct |
90 ms |
100600 KB |
Output is correct |
24 |
Correct |
121 ms |
100856 KB |
Output is correct |
25 |
Correct |
123 ms |
101024 KB |
Output is correct |
26 |
Correct |
122 ms |
101240 KB |
Output is correct |
27 |
Correct |
67 ms |
99192 KB |
Output is correct |
28 |
Correct |
59 ms |
99192 KB |
Output is correct |
29 |
Correct |
61 ms |
99192 KB |
Output is correct |
30 |
Correct |
67 ms |
99192 KB |
Output is correct |
31 |
Correct |
117 ms |
99576 KB |
Output is correct |
32 |
Correct |
67 ms |
99192 KB |
Output is correct |
33 |
Correct |
57 ms |
99196 KB |
Output is correct |
34 |
Correct |
57 ms |
99192 KB |
Output is correct |
35 |
Correct |
59 ms |
99192 KB |
Output is correct |
36 |
Correct |
78 ms |
99320 KB |
Output is correct |
37 |
Correct |
117 ms |
99704 KB |
Output is correct |
38 |
Correct |
60 ms |
99576 KB |
Output is correct |
39 |
Correct |
60 ms |
99632 KB |
Output is correct |
40 |
Correct |
61 ms |
99576 KB |
Output is correct |
41 |
Correct |
80 ms |
99704 KB |
Output is correct |
42 |
Correct |
130 ms |
100088 KB |
Output is correct |
43 |
Correct |
110 ms |
107876 KB |
Output is correct |
44 |
Correct |
103 ms |
107748 KB |
Output is correct |
45 |
Correct |
105 ms |
107752 KB |
Output is correct |
46 |
Correct |
145 ms |
107876 KB |
Output is correct |
47 |
Correct |
238 ms |
108556 KB |
Output is correct |
48 |
Correct |
62 ms |
99576 KB |
Output is correct |
49 |
Correct |
85 ms |
99552 KB |
Output is correct |
50 |
Correct |
211 ms |
99976 KB |
Output is correct |
51 |
Correct |
331 ms |
100088 KB |
Output is correct |
52 |
Correct |
95 ms |
102392 KB |
Output is correct |
53 |
Correct |
144 ms |
102392 KB |
Output is correct |
54 |
Correct |
375 ms |
102636 KB |
Output is correct |
55 |
Correct |
589 ms |
102904 KB |
Output is correct |
56 |
Correct |
241 ms |
116220 KB |
Output is correct |
57 |
Correct |
343 ms |
116344 KB |
Output is correct |
58 |
Correct |
734 ms |
116732 KB |
Output is correct |
59 |
Correct |
1075 ms |
116900 KB |
Output is correct |
60 |
Correct |
453 ms |
134908 KB |
Output is correct |
61 |
Correct |
548 ms |
134776 KB |
Output is correct |
62 |
Correct |
949 ms |
135172 KB |
Output is correct |
63 |
Correct |
1452 ms |
135432 KB |
Output is correct |
64 |
Correct |
2729 ms |
135756 KB |
Output is correct |
65 |
Correct |
2312 ms |
136320 KB |
Output is correct |
66 |
Correct |
2476 ms |
137436 KB |
Output is correct |
67 |
Correct |
2334 ms |
135864 KB |
Output is correct |
68 |
Correct |
2393 ms |
137708 KB |
Output is correct |
69 |
Correct |
2635 ms |
135796 KB |
Output is correct |
70 |
Correct |
2088 ms |
137284 KB |
Output is correct |
71 |
Correct |
3435 ms |
141992 KB |
Output is correct |
72 |
Correct |
3216 ms |
141828 KB |
Output is correct |
73 |
Correct |
3396 ms |
141856 KB |
Output is correct |
74 |
Correct |
3631 ms |
141856 KB |
Output is correct |
75 |
Correct |
3154 ms |
141428 KB |
Output is correct |
76 |
Correct |
2852 ms |
141560 KB |
Output is correct |
77 |
Correct |
3688 ms |
143548 KB |
Output is correct |
78 |
Correct |
3684 ms |
143364 KB |
Output is correct |
79 |
Correct |
3784 ms |
143652 KB |
Output is correct |
80 |
Correct |
4014 ms |
143432 KB |
Output is correct |
81 |
Correct |
3656 ms |
143384 KB |
Output is correct |
82 |
Correct |
3079 ms |
143092 KB |
Output is correct |
83 |
Correct |
3660 ms |
143468 KB |
Output is correct |
84 |
Correct |
3748 ms |
143440 KB |
Output is correct |
85 |
Correct |
3652 ms |
143488 KB |
Output is correct |
86 |
Correct |
3889 ms |
143516 KB |
Output is correct |
87 |
Correct |
3887 ms |
143416 KB |
Output is correct |
88 |
Correct |
3047 ms |
142952 KB |
Output is correct |
89 |
Correct |
2469 ms |
136844 KB |
Output is correct |
90 |
Correct |
2613 ms |
139664 KB |
Output is correct |
91 |
Correct |
3079 ms |
140856 KB |
Output is correct |
92 |
Correct |
3190 ms |
141584 KB |
Output is correct |
93 |
Correct |
3535 ms |
142104 KB |
Output is correct |
94 |
Correct |
3498 ms |
143640 KB |
Output is correct |
95 |
Correct |
3669 ms |
143204 KB |
Output is correct |
96 |
Correct |
3650 ms |
143380 KB |
Output is correct |
97 |
Correct |
3653 ms |
143328 KB |
Output is correct |
98 |
Correct |
3658 ms |
143260 KB |
Output is correct |
99 |
Correct |
3759 ms |
143368 KB |
Output is correct |
100 |
Correct |
3708 ms |
143324 KB |
Output is correct |