This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define pii pair<int, int>
#define pipii pair<int, pair<int, int>>
#define vi vector<int>
#define vpi vector<pair<int, long long>>
#define inp(name) if(fopen(name, "r")) freopen(name, "r", stdin);
#define out(name) if(fopen(name, "w")) freopen(name, "w", stdout);
const int N = 1e6 + 5;
using namespace std;
long long n, q, mod, tgian, in[N], out[N], pos[N], w[N];
vpi ad[N];
void dfs(int u, int p = 0)
{
in[u] = ++tgian;
for(auto [v, w] : ad[u])
{
if(v == p) continue ;
pos[w] = v;
dfs(v, u);
++tgian;
}
out[u]= tgian;
}
struct node
{
long long du = 0, dw = 0, duw = 0, dwv = 0, duwv = 0;
node operator + (const node &res) const
{
node tg ;
tg.du = max(du, res.du);
tg.dw = max(dw, res.dw);
tg.duw = max(max(duw, res.duw), du + res.dw);
tg.dwv = max(max(dwv, res.dwv), dw + res.du);
tg.duwv = max(max(duwv, res.duwv), max(du + res.dwv, duw + res.du));
return tg;
}
};
long long lz[4*N*2];
node st[4*N*2];
void lazy(int id, int l, int r)
{
if(lz[id] == 0) return ;
long long v = lz[id];
st[id].du += v;
st[id].dw -= v + v;
st[id].duw -= v;
st[id].dwv -= v;
if(l != r)
{
lz[2*id] += lz[id];
lz[2*id+1] += lz[id];
}
lz[id] = 0;
}
void upd(int id, int l, int r, int u, int v, long long val)
{
lazy(id, l, r);
if(u > r or v < l) return ;
if(u <= l and v >= r)
{
lz[id] += val;
lazy(id, l, r);
return ;
}
int mid = (l+r) / 2;
upd(2*id, l, mid, u, v, val);
upd(2*id+1, mid+1, r, u, v, val);
st[id] = st[2*id] + st[2*id+1];
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(0);
cin >> n >> q >> mod;
for(int i = 1; i < n; ++i)
{
int u, v; long long c;
cin >> u >> v >> c;
ad[u].pb({v, i});
ad[v].pb({u, i});
w[i] = c;
}
dfs(1);
for(int i = 1; i < n; ++i) upd(1, 1, tgian, in[pos[i]], out[pos[i]], w[i]);
long long last = 0;
while(q--)
{
int d; long long e;
cin >> d >> e;
d = 1 + (d + last) % (n-1); e = (e + last) % mod;
upd(1, 1, tgian, in[pos[d]], out[pos[d]], e - w[d]);
last = st[1].duwv, w[d] = e;
cout << last << "\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |