33072023-02-24 19:53:45gortomiXORfa visszatércpp17Time limit exceeded 28/1001.588s522252 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 val = no[x.first];
        int sb = x.first / b  + 1, eb = x.second / b - 1;
        for(int i = sb; i <= eb; i++)
        {
            trie[i].upd(v[val], 29, 1);
            maxi[i] = max(maxi[i], trie[i].get(v[val], 29));
        }
        for(int i = x.first; i <= min(sb * b - 1, x.second); i++) ins[i].push_back(val);
        for(int i = max(eb * b + 1, x.first); i <= x.second; i++) ins[i].push_back(val);
    }
    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
1Accepted3ms1836 KiB
2Accepted3ms2048 KiB
subtask211/11
3Accepted4ms2432 KiB
4Accepted4ms2400 KiB
5Accepted6ms2640 KiB
6Accepted4ms2800 KiB
7Accepted4ms2968 KiB
8Accepted6ms3224 KiB
9Accepted4ms3396 KiB
10Accepted6ms3476 KiB
11Accepted4ms3684 KiB
12Accepted4ms3820 KiB
13Accepted4ms3804 KiB
subtask30/13
14Accepted112ms18344 KiB
15Accepted177ms20944 KiB
16Time limit exceeded1.567s117756 KiB
17Time limit exceeded1.583s134968 KiB
18Time limit exceeded1.557s117988 KiB
19Time limit exceeded1.57s152780 KiB
20Time limit exceeded1.57s129300 KiB
21Time limit exceeded1.588s134388 KiB
22Accepted182ms21536 KiB
23Accepted184ms21548 KiB
subtask417/17
24Accepted158ms12096 KiB
25Accepted78ms9532 KiB
26Accepted254ms15372 KiB
27Accepted347ms17708 KiB
28Accepted412ms19428 KiB
29Accepted141ms11740 KiB
30Accepted179ms13192 KiB
31Accepted180ms13100 KiB
32Accepted130ms10320 KiB
33Accepted131ms10288 KiB
34Accepted131ms10232 KiB
35Accepted129ms10240 KiB
subtask50/59
36Runtime error532ms522252 KiB
37Runtime error527ms522224 KiB
38Runtime error526ms522200 KiB
39Runtime error617ms521972 KiB
40Runtime error521ms521968 KiB
41Runtime error529ms521952 KiB
42Runtime error532ms521724 KiB
43Runtime error532ms521724 KiB
44Runtime error643ms521708 KiB
45Time limit exceeded1.565s110584 KiB
46Time limit exceeded1.588s226216 KiB
47Time limit exceeded1.564s228464 KiB
48Time limit exceeded1.559s226100 KiB
49Time limit exceeded1.58s232292 KiB