Cod sursa(job #3146379)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 20 august 2023 17:38:28
Problema Arbore Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;

ifstream in ("arbore.in");
ofstream out ("arbore.out");

const int max_size = 1e5 + 1, max_nr = 1e6 + 1, sz = 316;

int v[max_size], lazy[sz], tin[max_size], tout[max_size], timp, poz[max_size], n, nrbkt;
bitset <max_nr> frecv[sz];
vector <int> mc[max_size];

void dfs (int nod, int par)
{
    tin[nod] = ++timp;
    poz[timp] = nod;
    for (auto f : mc[nod])
    {
        if (f == par)
        {
            continue;
        }
        dfs(f, nod);
    }
    tout[nod] = timp;
}

void updbkt (int bkt, int l, int r, int x)
{
    int bktst = bkt * sz, bktdr = (bkt + 1) * sz - 1;
    for (int i = bktst; i <= bktdr; i++)
    {
        frecv[bkt][v[i]] = 0;
    }
    for (int i = l; i <= r; i++)
    {
        v[i] += x;
    }
    for (int i = bktst; i <= bktdr; i++)
    {
        frecv[bkt][v[i]] = 1;
    }
}

void updlz (int nod, int x)
{
    int st = tin[nod], dr = tout[nod], bktst = st / sz, bktdr = dr / sz;
    if (bktst == bktdr)
    {
        updbkt(bktst, st, dr, x);
        return;
    }
    updbkt(bktst, st, (bktst + 1) * sz - 1, x);
    updbkt(bktdr, bktdr * sz, dr, x);
    for (int i = bktst + 1; i < bktdr; i++)
    {
        lazy[i] += x;
    }
}

int main ()
{
    int q;
    in >> n >> q;
    for (int i = 1; i < n; i++)
    {
        int x, y;
        in >> x >> y;
        mc[x].push_back(y);
        mc[y].push_back(x);
    }
    nrbkt = n / sz;
    for (int i = 0; i <= nrbkt; i++)
    {
        frecv[i][0] = 1;
    }
    dfs(1, 0);
    while (q--)
    {
        int op;
        in >> op;
        if (op == 1)
        {
            int nod, x;
            in >> nod >> x;
            updlz(nod, x);
        }
        else
        {
            int x, ans = -1;
            in >> x;
            for (int i = 0; i <= nrbkt; i++)
            {
                if (x < lazy[i] || frecv[i][x - lazy[i]] == 0)
                {
                    continue;
                }
                int val = x - lazy[i];
                for (int j = i * sz; j < (i + 1) * sz; j++)
                {
                    if (v[j] == val)
                    {
                        ans = poz[j];
                    }
                }
            }
            out << ans << '\n';
        }
    }
    in.close();
    out.close();
    return 0;
}