Cod sursa(job #3344960)

Utilizator unomMirel Costel unom Data 7 martie 2026 10:07:45
Problema Arbore Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <fstream>
#include <vector>
#include <cmath>
#include <unordered_map>

using namespace std;

ifstream in("arbore.in");
ofstream out("arbore.out");
int n, q, t;
pair<int, int> poz[100005];
int lin[100005];
vector<int> v[100005];
int BSIZE;
unordered_map<int, int> um[405];
int lazy_add[405];
int val[405];

void dfs(int nod, int tata)
{
    t++;
    poz[nod].first = t;
    lin[t] = nod;

    for(auto it: v[nod])
    {
        if(it == tata)
        {
            continue;
        }

        dfs(it, nod);
    }

    poz[nod].second = t;
}

void update(int st, int dr, int add)
{
    int bst = st / BSIZE;
    int bdr = dr / BSIZE;

    if(bst == bdr)
    {
        for(int i = st; i<=dr; i++)
        {
            um[bst][val[i]]--;

            val[i] += add;
            um[bst][val[i]]++;
        }
        return;
    }

    for(int i = st; i<(bst + 1) * BSIZE; i++)
    {
        um[bst][val[i]]--;

        val[i] += add;
        um[bst][val[i]]++;
    }

    for(int i = bst + 1; i<bdr; i++)
    {
        lazy_add[i] += add;
    }

    for(int i = bdr * BSIZE; i<=dr; i++)
    {
        um[bdr][val[i]]--;

        val[i] += add;
        um[bdr][val[i]]++;
    }
}

int query(int x)
{
    for(int b = 0; b <= (n + BSIZE - 1) / BSIZE; b++)
    {
        if(um[b][x - lazy_add[b]] != 0)
        {
            int st = b * BSIZE;
            int dr = (b + 1) * BSIZE - 1;

            for(int i = st; i<=dr; i++)
            {
                if(val[i] == x - lazy_add[b])
                {
                    return lin[i];
                }
            }

            exit(1);
        }
    }

    return -1;
}

int main()
{
    in>>n>>q;
    BSIZE = sqrt(n);

    int x, y;
    for(int i = 1; i<n; i++)
    {
        in>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }

    dfs(1, 0);

    for(int i = 1; i<=n; i++)
    {
        um[poz[i].first / BSIZE][0]++;
        val[poz[i].first] = 0;
    }

    int a, b, c;
    while(q--)
    {
        in>>a;

        if(a == 1)
        {
            in>>b>>c;

            update(poz[b].first, poz[b].second, c);
        }
        else
        {
            in>>b;

            out<<query(b)<<'\n';
        }
    }

    return 0;
}