Submission #1268995

#TimeUsernameProblemLanguageResultExecution timeMemory
1268995BahaminDynamic Diameter (CEOI19_diameter)C++17
100 / 100
412 ms63240 KiB
#include "bits/stdc++.h"

using namespace std;

template<typename A> ostream& operator<<(ostream& os, vector<A> x) {os << "{"; string sep; for (A y : x) os << sep << y, sep = ", "; return os << "}";}

#define all(a) (a).begin(), (a).end()
#define ll long long 
#define lid id << 1
#define rid id << 1 | 1
#define mid ((r + l) >> 1)
const int MAX_N = 1e5 + 5;
const int MOD = 1e9 + 7;
const ll INF = 1e18;
const int LOG = 30;

ll ps[MAX_N];
vector<pair<int, ll>> adj[MAX_N];
vector<int> al;
int st[MAX_N];
int fi[MAX_N];
ll w1[MAX_N];
int u1[MAX_N], v1[MAX_N];
ll h[MAX_N];

void dfs(int u, int p)
{
    st[u] = al.size();
    al.push_back(u);
    for (auto v : adj[u]) if (v.first != p) h[v.first] = h[u] + v.second, ps[v.first] = ps[u] + v.second, dfs(v.first, u), al.push_back(u);
    fi[u] = al.size();
}

struct node
{
    ll ans[3][3];
    node(){};
};

node merge(node x, node y)
{
    node re;
    for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++) 
    {
        re.ans[i][j] = max(x.ans[i][j], y.ans[i][j]);
        for (int p = i; p < j; p++) re.ans[i][j] = max(re.ans[i][j], x.ans[i][p] + y.ans[p + 1][j]);
    }
    return re;
}

node seg[MAX_N << 3];
ll ops[MAX_N << 3];

void build(int l, int r, int id)
{
    if (l == r - 1) 
    {
        for (int i = 0; i < 3; i++) 
        {
            int sum = 0;
            for (int j = i; j < 3; j++) 
            {
                if (j == 1) sum -= 2;
                else sum++;
                seg[id].ans[i][j] = 1ll * sum * ps[al[l]];
            }
        }
        return;
    }
    build(l, mid, lid);
    build(mid, r, rid);
    seg[id] = merge(seg[lid], seg[rid]);
}

void move(int l, int r, int id)
{
    if (l == r - 1) return;
    for (int i = 0; i < 3; i++)
    {
        int sum = 0;
        for (int j = i; j < 3; j++)
        {
            if (j == 1) sum -= 2;
            else sum++;
            seg[lid].ans[i][j] += 1ll * sum * ops[id];
            seg[rid].ans[i][j] += 1ll * sum * ops[id];
        }
    }
    ops[lid] += ops[id];
    ops[rid] += ops[id];
    ops[id] = 0;
}


void upd(int s, int t, ll x, int l, int r, int id)
{
    move(l, r, id);
    if (s <= l && t >= r)
    {
        ops[id] += x;
        for (int i = 0; i < 3; i++)
        {
            int sum = 0;
            for (int j = i; j < 3; j++)
            {
                if (j == 1) sum -= 2;
                else sum++;
                seg[id].ans[i][j] += 1ll * sum * x;
            }
        }
        return;
    }
    if (s < mid) upd(s, t, x, l, mid, lid);
    if (t > mid) upd(s, t, x, mid, r, rid);
    seg[id] = merge(seg[lid], seg[rid]);
}

void solve()
{
    ll n, q;
    cin >> n >> q;
    ll w;
    cin >> w;
    ll last = 0;
    for (int i = 0; i < n - 1; i++)
    {
        cin >> u1[i] >> v1[i] >> w1[i];
        adj[u1[i]].push_back({v1[i], w1[i]});
        adj[v1[i]].push_back({u1[i], w1[i]});
    }
    dfs(1, 0);
    build(0, al.size(), 1);
    while (q--)
    {
        ll d; ll e;
        cin >> d >> e;
        d = (d + last) % (n - 1);
        e = (e + last) % w;
        if (h[u1[d]] > h[v1[d]]) swap(u1[d], v1[d]);
        upd(st[v1[d]], fi[v1[d]], e - w1[d], 0, al.size(), 1);
        w1[d] = e;
        cout << (last = seg[1].ans[0][2]) << endl;
    }
}   

int main()
{
    cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);
    int tc = 1;
    // cin >> tc;
    while (tc--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...