Cod sursa(job #3316803)

Utilizator Radu_BicliBiclineru Radu Radu_Bicli Data 20 octombrie 2025 23:19:07
Problema Arbore Scor 100
Compilator cpp-64 Status done
Runda cex_01 Marime 1.98 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("arbore.in");
ofstream fout("arbore.out");
int n, q, i, a[100002], galmar, bat[100002], add[100002];
unordered_map<int, int> fr[100002];
vector<int> gr[100002];

int moment, timp[2][100002];

static inline void Dfs(int nod = 1, int tata = 0) {
    a[++moment] = nod;
    timp[0][nod] = moment;
    for(int urm : gr[nod]) {
        if(urm != tata) Dfs(urm, nod);
    }
    timp[1][nod] = moment;
}

static inline void Update(int st, int dr, int val) {
    int bst = st / galmar;
    int bdr = dr / galmar;

    for(int i = bst; i <= bdr; i++) {
        int lst = galmar * i;
        int ldr = galmar * (i + 1) - 1;

        if(st <= lst && ldr <= dr) bat[i] += val;
        else {
            lst = max(lst, st);
            ldr = min(ldr, dr);
            for(int j = lst; j <= ldr; j++) {
                fr[i][add[j]]--;
                if(fr[i][add[j]] <= 0) fr[i].erase(add[j]);
                add[j] += val;
                fr[i][add[j]]++;
            }
        }
    }
}

static inline int Query(int sum) {
    for(int i = 0; i < galmar + 2; i++) {
        if(fr[i].find(sum - bat[i]) != fr[i].end()){
            int st = galmar * i;
            int dr = galmar * (i + 1) - 1;
            for(int j = st; j <= dr; j++) {
                if(add[j] + bat[i] == sum) return a[j];
            }
        }
    }
    return -1;
}

int main() {
    fin.tie(NULL);
    fout.tie(NULL);

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

    galmar = n / sqrt(n);
    Dfs();

    for(i = 1; i <= n; i++) fr[(i - 1) / galmar].insert({0, 1});

    while(q--) {
        int op, x;
        fin >> op >> x;
        if(op == 1) {
            int y;
            fin >> y;
            Update(timp[0][x], timp[1][x], y);
        }
        else fout << Query(x) << "\n";
    }

    return 0;
}