Cod sursa(job #2923547)

Utilizator Iulia14iulia slanina Iulia14 Data 15 septembrie 2022 17:43:27
Problema Arbore Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <bits/stdc++.h>

using namespace std;
const int N = 1e5 + 5;
const int rad = 333;
vector <int> g[N];
bitset <1000005> vf[rad + 1];
int in[N], out[N], ord[N];
int v[N], adaug[N];
int n, m, timp;
void dfs(int nod, int dad = 0)
{
    in[nod] = ++timp;
    ord[timp] = nod;
    for (auto son : g[nod])
        if (son != dad)
            dfs(son, nod);
    out[nod] = timp;
}
void f(int gr, int l, int r, int val)
{
    for (int i = l; i <= r; i++)
        vf[gr][v[i]] = 0;
    for (int i = l; i <= r; i++)
    {
        v[i] += val;
        vf[gr][v[i]] = 1;
    }
    for (int i = gr * rad; i < l; i++)
        vf[gr][v[i]] = 1;
    for (int i = r + 1; i < (gr + 1) * rad && i <= n; i++)
        vf[gr][v[i]] = 1;
}

int main()
{
    freopen("arbore.in", "r", stdin);
    freopen("arbore.out", "w", stdout);
    cin >> n >> m;
    for (int i = 1; i < n; i++)
    {
        int x, y;
        cin >> x >> y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(1);
    while(m--)
    {
        int t, x, y;
        cin >> t >> x;
        if (t == 1)
        {
            cin >> y;
            int l = in[x], r = out[x];
            int gl = l / rad;
            int gr = r / rad;
            if (gl == gr)
            {
                f(gl, l, r, y);
                continue;
            }
            f(gl, l, (gl + 1) * rad - 1, y);
            f(gr, gr * rad, r, y);
            for (int i = gl + 1; i < gr; i++)
                adaug[i] += y;
            continue;
        }
        int ans = -1;
        for (int i = 0; i <= n / rad; i++)
        {
            if (x < adaug[i])
                continue;
            if (vf[i][x - adaug[i]])
            {
                for (int j = i * rad; j < (i + 1) * rad; j++)
                {
                    if (v[j] + adaug[i] == x && j)
                    {
                        ans = j;
                        break;
                    }
                }
                break;
            }
        }
        if (ans == -1)
            cout << ans;
        else
            cout << ord[ans];
        cout << '\n';
    }
    return 0;
}