35372023-02-28 19:51:41gortomiXORfa visszatércpp17Elfogadva 100/100698ms119336 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<vector<pair<int, int> > > g;
vector<int> v, ans;
vector<vector<int> > t;

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 w;
    node *lc, *rc;
    node()
    {
        w = 0;
        lc = nullptr;
        rc = nullptr;
    }
    void extend()
    {
        if(lc == nullptr)
        {
            lc = new node();
            rc = new node();
        }
    }
    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);
        }
    }
};
node root = node();
int maxi = 0;
void update(int no, int l, int r, int tl, int tr, int val)
{
    if(tl > tr) return;
    if(l == tl && r == tr)
    {
        t[no].push_back(val);
        return;
    }
    int m = (l + r) / 2;
    update(no * 2, l, m, tl, min(tr, m), val);
    update(no * 2 + 1, m + 1, r, max(tl, m + 1), tr, val);
}
void get(int no, int l, int r)
{
    int k = maxi;
    for(auto x : t[no])
    {
        root.upd(x, 29, 1);
        maxi = max(maxi, root.get(x, 29));
    }
    if(l == r) ans[l] = maxi;
    else
    {
        int m = (l + r) / 2;
        get(no * 2, l, m);
        get(no * 2 + 1, m + 1, r);
    }
    for(auto x : t[no])
    {
        root.upd(x, 29, -1);
    }
    maxi = k;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, q;
    cin >> n >> q;
    g.resize(n + 1);
    v.resize(n + 1);
    ans.resize(q);
    t.resize(4 * q);
    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});
    for(auto x : add)
    {
        update(1, 0, q - 1, x.first, x.second, v[no[x.first]]);
    }
    get(1, 0, q - 1);
    for(auto x : ans) cout << x << "\n";
    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1828 KiB
2Elfogadva3ms2060 KiB
subtask211/11
3Elfogadva3ms2520 KiB
4Elfogadva3ms2748 KiB
5Elfogadva3ms3036 KiB
6Elfogadva3ms3184 KiB
7Elfogadva3ms3404 KiB
8Elfogadva3ms3572 KiB
9Elfogadva3ms3640 KiB
10Elfogadva3ms3420 KiB
11Elfogadva3ms3744 KiB
12Elfogadva3ms3892 KiB
13Elfogadva3ms3844 KiB
subtask313/13
14Elfogadva74ms27564 KiB
15Elfogadva79ms28292 KiB
16Elfogadva178ms33984 KiB
17Elfogadva197ms35928 KiB
18Elfogadva207ms35964 KiB
19Elfogadva215ms35568 KiB
20Elfogadva192ms35432 KiB
21Elfogadva201ms36136 KiB
22Elfogadva83ms28656 KiB
23Elfogadva82ms28572 KiB
subtask417/17
24Elfogadva7ms6608 KiB
25Elfogadva6ms6520 KiB
26Elfogadva8ms6952 KiB
27Elfogadva8ms7280 KiB
28Elfogadva8ms7492 KiB
29Elfogadva7ms6608 KiB
30Elfogadva7ms6632 KiB
31Elfogadva8ms6628 KiB
32Elfogadva4ms5100 KiB
33Elfogadva4ms5096 KiB
34Elfogadva4ms5096 KiB
35Elfogadva4ms5160 KiB
subtask559/59
36Elfogadva495ms90752 KiB
37Elfogadva384ms80836 KiB
38Elfogadva598ms102432 KiB
39Elfogadva698ms113468 KiB
40Elfogadva630ms119336 KiB
41Elfogadva481ms90120 KiB
42Elfogadva519ms90652 KiB
43Elfogadva453ms90580 KiB
44Elfogadva435ms90072 KiB
45Elfogadva206ms70224 KiB
46Elfogadva231ms36864 KiB
47Elfogadva212ms36876 KiB
48Elfogadva218ms36880 KiB
49Elfogadva216ms36860 KiB