Cod sursa(job #3289848)

Utilizator IleaIlea Bogdan Ilea Data 28 martie 2025 18:15:59
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include <vector>
#include <unordered_set>
#include <unordered_map>
#include <set>
using namespace std;

#define NMAX 100001

int n, q;
vector<int> g[NMAX];
unordered_set<int> suba[NMAX];
unordered_map<int, int> rmoney;
unordered_map<int, set<int>> money;
void dfs(int r, int p){
    suba[r].insert(r);
    money[0].insert(r);
    rmoney[r]=0;
    for (auto it:g[r]){
        if (it==p)continue;
        dfs(it, r);
        //if (suba[r].size()<suba[it].size())swap(suba[r], suba[it]);
        for (auto iit:suba[it])suba[r].insert(iit);
    }
}
void solve(void){
    cin>>n>>q;
    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, 0);
    while (q--){
        int op;
        cin>>op;
        if (op==1){
            int p, s;
            cin>>p>>s;
            for (auto it:suba[p]){
                int m=rmoney[it];
                money[m].erase(it);
                money[m+s].insert(it);
                rmoney[it]=m+s;
            }
        } else {
            int s;
            cin>>s;
            if (money.count(s))cout<<*money[s].begin()<<"\n";
            else cout<<"-1\n";
        }
    }
}
int main(void){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    #ifdef LOCAL
        freopen("date.in", "r", stdin);
        freopen("log.txt", "w", stdout);
    #else
        freopen("arbore.in", "r", stdin);
        freopen("arbore.out", "w", stdout);
    #endif
    solve();
    return 0;
}