Submission #800423

# Submission time Handle Problem Language Result Execution time Memory
800423 2023-08-01T14:38:39 Z fve5 Dynamic Diameter (CEOI19_diameter) C++17
100 / 100
3152 ms 166144 KB
#include <bits/stdc++.h>
using namespace std;

constexpr int64_t INF = 2e18;

class SegTree {
    int size;
    vector<int64_t> arr, lazy;
    
    void update(int n, int nb, int ne) {
        if (lazy[n]) {
            arr[n] += lazy[n];
            
            if (nb + 1 != ne) {
                lazy[2 * n] += lazy[n];
                lazy[2 * n + 1] += lazy[n];
            }
            
            lazy[n] = 0;
        }
    }
    
    void add(int l, int r, int64_t d, int n, int nb, int ne) {
        update(n, nb, ne);
        if (nb >= r || ne <= l) return;
        if (l <= nb && ne <= r) {
            lazy[n] = d;
            update(n, nb, ne);
            return;
        }
        add(l, r, d, 2 * n, nb, (nb + ne) / 2);
        add(l, r, d, 2 * n + 1, (nb + ne) / 2, ne);
        arr[n] = max(arr[2 * n], arr[2 * n + 1]);
    }
    
public:
    
    void add(int l, int r, int64_t d) { add(l, r, d, 1, 0, size); }
    int64_t query() {
        return arr[1] + lazy[1];
    }
    
    SegTree() {}
    SegTree(vector<int64_t> vals) {
        size = 1 << (32 - __builtin_clz(vals.size() - 1));
        arr.resize(size * 2, -INF);
        lazy.resize(size * 2);
        
        for (int i = 0; i < vals.size(); i++)
            arr[i + size] = vals[i];
        for (int i = size - 1; i > 0; i--)
            arr[i] = max(arr[2 * i], arr[2 * i + 1]);
    };
};

class Tree {
    vector<vector<tuple<int, int, int64_t>>> adj;
    
    int centroid_tree_root;
    
    vector<vector<tuple<int, int, int>>> ranges;
    vector<SegTree> segtrees;
    vector<set<pair<int64_t, int>, greater<>>> sizes, subtrees;
public:

    int64_t diameter() {
        return sizes[centroid_tree_root].begin()->first;
    }
    
    int64_t get_max_path(int c) {
        if (subtrees[c].size() > 1) return subtrees[c].begin()->first + next(subtrees[c].begin())->first;
        if (subtrees[c].size() == 1) return subtrees[c].begin()->first;
        return 0;
    }
    
    void update(int edge, int64_t d) {
        int old = -1;
        int64_t old_max_seg, old_max_path;
        for (auto [c, l, r]: ranges[edge]) {
            int64_t new_old_max_seg = segtrees[c].query();
            int64_t new_old_max_path = sizes[c].begin()->first;
            int64_t old_max_path_through = get_max_path(c);
            
            if (old != -1) {
                subtrees[c].erase({old_max_seg, old});
                sizes[c].erase({old_max_path, old});
                
                subtrees[c].emplace(segtrees[old].query(), old);
                sizes[c].emplace(sizes[old].begin()->first, old);
            }
            
            segtrees[c].add(l, r, d);
            sizes[c].erase({old_max_path_through, c});
            sizes[c].emplace(get_max_path(c), c);
            
            old_max_seg = new_old_max_seg;
            old_max_path = new_old_max_path;
            old = c;
        }
    }
    
    Tree(int n, vector<tuple<int, int, int64_t>> edges) :
        adj(n), ranges(n - 1), segtrees(n), sizes(n), subtrees(n)
    {
        for (int i = 0; i < n - 1; i++) {
            auto [u, v, w] = edges[i];
            adj[u].emplace_back(v, i ,w);
            adj[v].emplace_back(u, i, w);    
        }
        
        vector<bool> nodes(n);
        vector<int> parent(n);
        vector<int64_t> dfs_order;
        
        function<int(int, int, vector<int>&)> populate = [&](int node, int par, vector<int> &size) {
            size[node] = 1;
            for (auto [n, i, w]: adj[node]) {
                if (n == par || nodes[n]) continue;
                parent[n] = node;
                size[node] += populate(n, node, size);
            }
            return size[node];
        };
        
        function<void(int, int, int, int64_t)> get_dfs_order = [&](int node, int in_edge, int centroid, int64_t d) {
            int start = dfs_order.size();
            dfs_order.push_back(d);
            for (auto [n, i, w]: adj[node]) {
                if (i == in_edge || nodes[n]) continue;
                get_dfs_order(n, i, centroid, d + w);
            }
            
            int end = dfs_order.size();
            if (in_edge >= 0) ranges[in_edge].emplace_back(centroid, start, end);
        };
        
        function<int(int, int, int64_t)> make_centroid_tree = [&](int root, int curr_size, int64_t d) -> int {
            vector<int> size(n);
            populate(root, -1, size);
            parent[root] = -1;
            
            int centroid = root;
            for (;;) {
                bool found = true;
                for (auto [n, i, w]: adj[centroid]) {
                    if (!nodes[n] && n != parent[centroid] && 2 * size[n] > curr_size) {
                        centroid = n;
                        found = false;
                        break;
                    }
                }
                if (found) break;
            }
            
            dfs_order.clear();
            get_dfs_order(root, -1, centroid, d);
            segtrees[centroid] = SegTree(dfs_order);
            
            nodes[centroid] = true;
            
            for (auto [n, i, w]: adj[centroid]) {
                if (nodes[n]) continue;
                if (n == parent[centroid]) {
                    int c = make_centroid_tree(n, curr_size - size[centroid], w);
                    
                    ranges[i].emplace_back(c, 0, curr_size - size[centroid]);
                    
                    sizes[centroid].emplace(sizes[c].begin()->first, c);
                    subtrees[centroid].emplace(segtrees[c].query(), c);
                } else {
                    int c = make_centroid_tree(n, size[n], w);
                    
                    ranges[i].emplace_back(c, 0, size[n]);
                    
                    sizes[centroid].emplace(sizes[c].begin()->first, c);
                    subtrees[centroid].emplace(segtrees[c].query(), c);
                }
            }
            
            sizes[centroid].emplace(get_max_path(centroid), centroid);
            
            return centroid;
        };
        
        centroid_tree_root = make_centroid_tree(0, n, 0);
        for (auto &vec: ranges) {
            reverse(vec.begin(), vec.end());
        }
    }
};

int main() {
    ios::sync_with_stdio(false); cin.tie(NULL);
    
    int n, q; cin >> n >> q;
    int64_t w; cin >> w;
    
    vector<int64_t> edge_weights(n - 1);
    vector<tuple<int, int, int64_t>> edges(n - 1);
    for (int i = 0; i < n - 1; i++) {
        auto &[u, v, w] = edges[i];
        
        cin >> u >> v >> w;
        u--, v--;
        
        edge_weights[i] = w;
    }
    
    Tree tree(n, edges);
    
    int64_t last = 0;
    while (q--) {
        int edge; cin >> edge;
        int64_t new_w; cin >> new_w;
        
        edge = (edge + last) % (n - 1);
        new_w = (new_w + last) % w;
        
        tree.update(edge, new_w - edge_weights[edge]);
        cout << (last = tree.diameter()) << "\n";
        
        edge_weights[edge] = new_w;
    }
}

Compilation message

diameter.cpp: In constructor 'SegTree::SegTree(std::vector<long int>)':
diameter.cpp:49:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |         for (int i = 0; i < vals.size(); i++)
      |                         ~~^~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 328 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
14 Correct 1 ms 320 KB Output is correct
15 Correct 1 ms 340 KB Output is correct
16 Correct 1 ms 340 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 1 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 328 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
14 Correct 1 ms 320 KB Output is correct
15 Correct 1 ms 340 KB Output is correct
16 Correct 1 ms 340 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 1 ms 340 KB Output is correct
19 Correct 12 ms 1292 KB Output is correct
20 Correct 14 ms 1296 KB Output is correct
21 Correct 16 ms 1360 KB Output is correct
22 Correct 17 ms 1528 KB Output is correct
23 Correct 32 ms 5452 KB Output is correct
24 Correct 30 ms 6228 KB Output is correct
25 Correct 33 ms 6740 KB Output is correct
26 Correct 34 ms 7788 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 2 ms 340 KB Output is correct
4 Correct 12 ms 468 KB Output is correct
5 Correct 59 ms 1344 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 596 KB Output is correct
8 Correct 1 ms 596 KB Output is correct
9 Correct 3 ms 596 KB Output is correct
10 Correct 17 ms 856 KB Output is correct
11 Correct 82 ms 1780 KB Output is correct
12 Correct 7 ms 3668 KB Output is correct
13 Correct 7 ms 3756 KB Output is correct
14 Correct 10 ms 3836 KB Output is correct
15 Correct 29 ms 3984 KB Output is correct
16 Correct 120 ms 4844 KB Output is correct
17 Correct 675 ms 66764 KB Output is correct
18 Correct 707 ms 66620 KB Output is correct
19 Correct 663 ms 66620 KB Output is correct
20 Correct 689 ms 66580 KB Output is correct
21 Correct 1018 ms 66596 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 1236 KB Output is correct
2 Correct 20 ms 1464 KB Output is correct
3 Correct 93 ms 2012 KB Output is correct
4 Correct 184 ms 2824 KB Output is correct
5 Correct 26 ms 12260 KB Output is correct
6 Correct 51 ms 12284 KB Output is correct
7 Correct 161 ms 12736 KB Output is correct
8 Correct 297 ms 13200 KB Output is correct
9 Correct 405 ms 64768 KB Output is correct
10 Correct 422 ms 64880 KB Output is correct
11 Correct 615 ms 64512 KB Output is correct
12 Correct 864 ms 64464 KB Output is correct
13 Correct 1431 ms 132072 KB Output is correct
14 Correct 1462 ms 132240 KB Output is correct
15 Correct 1707 ms 132276 KB Output is correct
16 Correct 2131 ms 131956 KB Output is correct
17 Correct 2437 ms 131964 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2495 ms 126524 KB Output is correct
2 Correct 2559 ms 128800 KB Output is correct
3 Correct 2646 ms 127828 KB Output is correct
4 Correct 2574 ms 128404 KB Output is correct
5 Correct 2382 ms 124596 KB Output is correct
6 Correct 2013 ms 95572 KB Output is correct
7 Correct 3107 ms 147356 KB Output is correct
8 Correct 3151 ms 148468 KB Output is correct
9 Correct 3040 ms 147992 KB Output is correct
10 Correct 3076 ms 147332 KB Output is correct
11 Correct 2946 ms 142888 KB Output is correct
12 Correct 2473 ms 107420 KB Output is correct
13 Correct 3049 ms 166088 KB Output is correct
14 Correct 3023 ms 165404 KB Output is correct
15 Correct 3086 ms 165660 KB Output is correct
16 Correct 3020 ms 165052 KB Output is correct
17 Correct 2958 ms 158172 KB Output is correct
18 Correct 2326 ms 117260 KB Output is correct
19 Correct 3143 ms 165232 KB Output is correct
20 Correct 3038 ms 166144 KB Output is correct
21 Correct 2983 ms 165388 KB Output is correct
22 Correct 3046 ms 164980 KB Output is correct
23 Correct 2924 ms 158160 KB Output is correct
24 Correct 2373 ms 112896 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 328 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
14 Correct 1 ms 320 KB Output is correct
15 Correct 1 ms 340 KB Output is correct
16 Correct 1 ms 340 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 1 ms 340 KB Output is correct
19 Correct 12 ms 1292 KB Output is correct
20 Correct 14 ms 1296 KB Output is correct
21 Correct 16 ms 1360 KB Output is correct
22 Correct 17 ms 1528 KB Output is correct
23 Correct 32 ms 5452 KB Output is correct
24 Correct 30 ms 6228 KB Output is correct
25 Correct 33 ms 6740 KB Output is correct
26 Correct 34 ms 7788 KB Output is correct
27 Correct 0 ms 212 KB Output is correct
28 Correct 1 ms 212 KB Output is correct
29 Correct 2 ms 340 KB Output is correct
30 Correct 12 ms 468 KB Output is correct
31 Correct 59 ms 1344 KB Output is correct
32 Correct 1 ms 212 KB Output is correct
33 Correct 1 ms 596 KB Output is correct
34 Correct 1 ms 596 KB Output is correct
35 Correct 3 ms 596 KB Output is correct
36 Correct 17 ms 856 KB Output is correct
37 Correct 82 ms 1780 KB Output is correct
38 Correct 7 ms 3668 KB Output is correct
39 Correct 7 ms 3756 KB Output is correct
40 Correct 10 ms 3836 KB Output is correct
41 Correct 29 ms 3984 KB Output is correct
42 Correct 120 ms 4844 KB Output is correct
43 Correct 675 ms 66764 KB Output is correct
44 Correct 707 ms 66620 KB Output is correct
45 Correct 663 ms 66620 KB Output is correct
46 Correct 689 ms 66580 KB Output is correct
47 Correct 1018 ms 66596 KB Output is correct
48 Correct 4 ms 1236 KB Output is correct
49 Correct 20 ms 1464 KB Output is correct
50 Correct 93 ms 2012 KB Output is correct
51 Correct 184 ms 2824 KB Output is correct
52 Correct 26 ms 12260 KB Output is correct
53 Correct 51 ms 12284 KB Output is correct
54 Correct 161 ms 12736 KB Output is correct
55 Correct 297 ms 13200 KB Output is correct
56 Correct 405 ms 64768 KB Output is correct
57 Correct 422 ms 64880 KB Output is correct
58 Correct 615 ms 64512 KB Output is correct
59 Correct 864 ms 64464 KB Output is correct
60 Correct 1431 ms 132072 KB Output is correct
61 Correct 1462 ms 132240 KB Output is correct
62 Correct 1707 ms 132276 KB Output is correct
63 Correct 2131 ms 131956 KB Output is correct
64 Correct 2437 ms 131964 KB Output is correct
65 Correct 2495 ms 126524 KB Output is correct
66 Correct 2559 ms 128800 KB Output is correct
67 Correct 2646 ms 127828 KB Output is correct
68 Correct 2574 ms 128404 KB Output is correct
69 Correct 2382 ms 124596 KB Output is correct
70 Correct 2013 ms 95572 KB Output is correct
71 Correct 3107 ms 147356 KB Output is correct
72 Correct 3151 ms 148468 KB Output is correct
73 Correct 3040 ms 147992 KB Output is correct
74 Correct 3076 ms 147332 KB Output is correct
75 Correct 2946 ms 142888 KB Output is correct
76 Correct 2473 ms 107420 KB Output is correct
77 Correct 3049 ms 166088 KB Output is correct
78 Correct 3023 ms 165404 KB Output is correct
79 Correct 3086 ms 165660 KB Output is correct
80 Correct 3020 ms 165052 KB Output is correct
81 Correct 2958 ms 158172 KB Output is correct
82 Correct 2326 ms 117260 KB Output is correct
83 Correct 3143 ms 165232 KB Output is correct
84 Correct 3038 ms 166144 KB Output is correct
85 Correct 2983 ms 165388 KB Output is correct
86 Correct 3046 ms 164980 KB Output is correct
87 Correct 2924 ms 158160 KB Output is correct
88 Correct 2373 ms 112896 KB Output is correct
89 Correct 2545 ms 127656 KB Output is correct
90 Correct 2703 ms 134344 KB Output is correct
91 Correct 3115 ms 144172 KB Output is correct
92 Correct 3035 ms 146088 KB Output is correct
93 Correct 3008 ms 153860 KB Output is correct
94 Correct 3129 ms 154628 KB Output is correct
95 Correct 3152 ms 161652 KB Output is correct
96 Correct 3046 ms 159664 KB Output is correct
97 Correct 3143 ms 161688 KB Output is correct
98 Correct 3142 ms 165084 KB Output is correct
99 Correct 3014 ms 161252 KB Output is correct
100 Correct 3082 ms 160704 KB Output is correct