제출 #1245515

#제출 시각아이디문제언어결과실행 시간메모리
1245515BlockOGDynamic Diameter (CEOI19_diameter)C++20
0 / 100
194 ms28224 KiB
#include <bits/stdc++.h>

// mrrrow meeow :3
// go play vivid/stasis now! it's free on steam

#define fo(i, a, b) for (auto i = (a); i < (b); i++)
#define of(i, a, b) for (auto i = (b); i-- > (a);)
#define f first
#define s second
#define pb push_back
#define pob pop_back
#define lb lower_bound
#define ub upper_bound
#define be(a) a.begin(), a.end()
using namespace std;

int ____init = [] {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    return 0;
}();

struct Node {
    long long sum00, sum10, sum01, sum11;

    Node() : sum00(0), sum10(0), sum01(0), sum11(0) {}
    Node(long long v) : sum00(max(v, 0ll)), sum10(max(v, 0ll)), sum01(max(v, 0ll)), sum11(v) {}

    Node combine(const Node &r) const {
        const Node &l = *this;
        Node res;

        res.sum00 = max(max(l.sum00, r.sum00), l.sum01 + r.sum10);
        res.sum10 = max(l.sum10, l.sum11 + r.sum10);
        res.sum01 = max(l.sum01 + r.sum11, r.sum01);
        res.sum11 = l.sum11 + r.sum11;

        return res;
    }
};

const int N = 1 << 18;
Node st[N * 2];
int l = 0;

void st_set(int i, long long v) {
    i += N;
    st[i] = Node(v);
    for (i /= 2; i > 0; i /= 2) st[i] = st[i * 2].combine(st[i * 2 + 1]);
}

vector<pair<int, pair<int, long long>>> adj[100000];
pair<int, int> eedges[99999];

void dfs(int i, int p = -1) {
    for (auto [j, c] : adj[i]) {
        if (j == p) continue;

        eedges[c.f].f = l;
        st[N + l++] = Node(c.s);

        dfs(j, i);

        eedges[c.f].s = l;
        st[N + l++] = Node(-c.s);
    }
}

int main() {
    int n, q;
    long long w;
    cin >> n >> q >> w;
    fo(i, 0, n - 1) {
        int a, b;
        long long c;
        cin >> a >> b >> c;
        a--, b--;
        adj[a].pb({b, {i, c}});
        adj[b].pb({a, {i, c}});
    }
    dfs(0);
    of(i, 1, N) st[i] = st[i * 2].combine(st[i * 2 + 1]);

    long long last = 0;
    while (q--) {
        long long d, e;
        cin >> d >> e;

        d = (d + last) % (n - 1);
        e = (e + last) % w;

        st_set(eedges[d].f, e);
        st_set(eedges[d].s, -e);

        cout << st[1].sum00 << endl;
        last = st[1].sum00;
    }
}
#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...