Cod sursa(job #3316583)

Utilizator PetreIonutPetre Ionut PetreIonut Data 19 octombrie 2025 12:44:07
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda cex_01 Marime 1.45 kb
#include <bits/stdc++.h>
#define NMAX 100005
#define mod 666013
#define ll long long

std::ifstream f("arbore.in");
std::ofstream g("arbore.out");

using namespace std;

struct ceva{
    bool ok;
    int x;
};
int n, q, t;
vector<int> muchii[NMAX];
unordered_map<int, int> fr;
int pret[NMAX], parinte[NMAX];
ceva vizitat[NMAX];
bool ramai=0;

void dfs(int nod, int adun, int prev){
    pret[nod]+=adun;
    for(auto x:muchii[nod]){
        if(vizitat[x].ok==0 || (vizitat[x].ok==1 && vizitat[x].x!=t)){
            if(x!=prev && x!=-1){
            vizitat[x]={1, t};
            dfs(x, adun, prev);
            }
        }
    }
}

void dfs1(int nod, int p){
    if(ramai==1) return;
    if(pret[nod]==p){
        g << nod << '\n';
        ramai=1;
        return;
    }
    for(auto x:muchii[nod]){
        if(vizitat[x].ok==0 || (vizitat[x].ok==1 && vizitat[x].x!=t)){
            vizitat[x]={1, t};
            dfs1(x, p);
        }
    }
}

void update(){
    int x, y;
    f >> x >> y;
    vizitat[x]={1, t};
    dfs(x, y, parinte[x]);
}

void solve(){
    int x;
    f >> x;
    ramai=0;
    dfs1(1, x);
    if(ramai==0) g << -1 << '\n';
}

int main(){
    f >> n >> q;
    fr[0]=n;
    parinte[1]=-1;
    for(int i=1;i<n;i++){
        int x, y;
        f >> x >> y;
        muchii[x].push_back(y);
        muchii[y].push_back(x);
        parinte[y]=x;
    }
    for(int i=1;i<=q;i++){
        int cer;
        f >> cer;
        t=i;
        (cer==1)?update():solve();
    }
}