33172023-02-25 09:20:29gortomiXORfa visszatércpp17Time limit exceeded 28/1001.585s522040 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(m + 1, r);
        }
    }
    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
1Accepted3ms1840 KiB
2Accepted3ms2044 KiB
subtask211/11
3Accepted4ms2668 KiB
4Accepted3ms2732 KiB
5Accepted4ms3152 KiB
6Accepted4ms3184 KiB
7Accepted4ms3404 KiB
8Accepted4ms3404 KiB
9Accepted4ms3504 KiB
10Accepted4ms3472 KiB
11Accepted4ms3420 KiB
12Accepted4ms3544 KiB
13Accepted4ms3588 KiB
subtask30/13
14Accepted79ms17244 KiB
15Accepted115ms18548 KiB
16Time limit exceeded1.585s67196 KiB
17Time limit exceeded1.572s78096 KiB
18Time limit exceeded1.585s91992 KiB
19Time limit exceeded1.572s95392 KiB
20Time limit exceeded1.572s74896 KiB
21Time limit exceeded1.572s78536 KiB
22Accepted119ms19636 KiB
23Accepted115ms19608 KiB
subtask417/17
24Accepted78ms11308 KiB
25Accepted45ms9032 KiB
26Accepted115ms13832 KiB
27Accepted155ms16016 KiB
28Accepted186ms17512 KiB
29Accepted70ms11232 KiB
30Accepted87ms12256 KiB
31Accepted90ms12184 KiB
32Accepted67ms7820 KiB
33Accepted67ms7748 KiB
34Accepted67ms7840 KiB
35Accepted67ms7988 KiB
subtask50/59
36Runtime error523ms522040 KiB
37Runtime error523ms522012 KiB
38Runtime error518ms521992 KiB
39Runtime error510ms521760 KiB
40Runtime error512ms521736 KiB
41Runtime error524ms521736 KiB
42Runtime error537ms521724 KiB
43Runtime error544ms521728 KiB
44Runtime error541ms521724 KiB
45Time limit exceeded1.56s119172 KiB
46Time limit exceeded1.582s188240 KiB
47Time limit exceeded1.559s198100 KiB
48Time limit exceeded1.572s196044 KiB
49Time limit exceeded1.58s187320 KiB