33082023-02-24 20:32:05gortomiXORfa visszatércpp17Time limit exceeded 28/1001.598s522304 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<pair<int, int> > > g;
vector<int> v;
void dfs(int n, int p)
{
    for(auto x : g[n])
    {
        int y = x.first, z = x.second;
        if(y != p)
        {
            v[y] = v[n] ^ z;
            dfs(y, n);
        }
    }
}
struct node
{
    int l, r, w, m;
    node *lc, *rc;
    node(int il, int ir)
    {
        l = il;
        r = ir;
        m = (l + r) / 2;
        w = 0;
        lc = nullptr;
        rc = nullptr;
    }
    void extend()
    {
        if(lc == nullptr)
        {
            lc = new node(l, m);
            rc = new node(r, m);
        }
    }
    void upd(int k, int ind, int del)
    {
        w += del;
        if(ind == -1) return;
        extend();
        if((k >> ind) & 1) rc -> upd(k, ind - 1, del);
        else lc -> upd(k, ind - 1, del);
    }
    int get(int k, int ind)
    {
        if(ind == -1) return 0;
        extend();
        if(((k >> ind) & 1))
        {
            if(lc -> w > 0) return lc -> get(k, ind - 1) + (1 << ind);
            else return rc -> get(k, ind - 1);
        }
        else
        {
            if(rc -> w > 0) return rc -> get(k, ind - 1) + (1 << ind);
            else return lc -> get(k, ind - 1);
        }
    }
};
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, q;
    cin >> n >> q;
    g.resize(n + 1);
    v.resize(n + 1);
    for(int i = 0; i < n - 1; i++)
    {
        int x, y, w;
        cin >> x >> y >> w;
        g[x].push_back({y, w});
        g[y].push_back({x, w});
    }
    dfs(1, 0);
    const int b = 300;
    vector<int> no(q);
    vector<int> act(n + 1, -1);
    vector<pair<int, int> > add;
    for(int i = 0; i < q; i++)
    {
        cin >> no[i];
        if(act[no[i]] == -1)
        {
            act[no[i]] = i;
        }
        else
        {
            add.push_back({act[no[i]], i - 1});
            act[no[i]] = -1;
        }
    }
    for(int i = 1; i <= n; i++) if(act[i] != -1) add.push_back({act[i], q - 1});
    node neu = node(0, 0);
    vector<node> trie(b, neu);
    vector<int> maxi(b);
    vector<vector<int> > ins(q);
    for(int i = 0; i < b; i++) trie[i] = node(0, (1 << 30) - 1);
    for(auto x : add)
    {
        int l = x.first, r = x.second;
        int val = no[l];
        while(l % b != 0 && l <= r)
        {
            ins[l].push_back(val);
            l++;
        }
        while(l + b - 1 <= r)
        {
            trie[l / b].upd(v[val], 29, 1);
            maxi[l / b] = max(maxi[l / b], trie[l / b].get(v[val], 29));
            l += b;
        }
        while(l <= r)
        {
            ins[l].push_back(val);
            l++;
        }
    }
    for(int i = 0; i < q; i++)
    {
        int actb = i / b;
        int ans = maxi[actb];
        for(auto x : ins[i])
        {
            trie[actb].upd(v[x], 29, 1);
            ans = max(ans, trie[actb].get(v[x], 29));
        }
        cout << ans << "\n";
        for(auto x : ins[i]) trie[actb].upd(v[x], 29, -1);
    }
    return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted3ms1708 KiB
2Accepted3ms2016 KiB
subtask211/11
3Accepted4ms2392 KiB
4Accepted3ms2640 KiB
5Accepted4ms3048 KiB
6Accepted4ms3212 KiB
7Accepted4ms3160 KiB
8Accepted4ms3264 KiB
9Accepted4ms3420 KiB
10Accepted4ms3408 KiB
11Accepted4ms3432 KiB
12Accepted4ms3520 KiB
13Accepted4ms3732 KiB
subtask30/13
14Accepted79ms17360 KiB
15Accepted115ms18772 KiB
16Time limit exceeded1.567s67184 KiB
17Time limit exceeded1.554s77976 KiB
18Time limit exceeded1.58s91800 KiB
19Time limit exceeded1.58s91520 KiB
20Time limit exceeded1.587s75076 KiB
21Time limit exceeded1.55s78408 KiB
22Accepted119ms19264 KiB
23Accepted123ms19276 KiB
subtask417/17
24Accepted79ms11192 KiB
25Accepted45ms9004 KiB
26Accepted118ms13728 KiB
27Accepted156ms15712 KiB
28Accepted185ms17164 KiB
29Accepted71ms10840 KiB
30Accepted86ms11804 KiB
31Accepted90ms11680 KiB
32Accepted67ms7336 KiB
33Accepted67ms7492 KiB
34Accepted65ms7500 KiB
35Accepted67ms7392 KiB
subtask50/59
36Runtime error529ms522304 KiB
37Runtime error529ms522272 KiB
38Runtime error523ms522168 KiB
39Runtime error616ms522164 KiB
40Runtime error514ms522144 KiB
41Runtime error527ms522012 KiB
42Runtime error529ms521996 KiB
43Runtime error532ms522000 KiB
44Runtime error632ms521980 KiB
45Time limit exceeded1.582s119844 KiB
46Time limit exceeded1.598s194536 KiB
47Time limit exceeded1.577s203612 KiB
48Time limit exceeded1.598s202712 KiB
49Time limit exceeded1.58s186036 KiB