Cod sursa(job #2181129)

Utilizator papinub2Papa Valentin papinub2 Data 21 martie 2018 14:20:30
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

const int Nmax = 100005;
const int Pmax = 1000005;

vector<int> A[Nmax];

void DFS (int nod, vector<int>&tata)
{
    for (int i = 0; i < A[nod].size(); i++)
    {
        int nod_curent = A[nod][i];
        if (tata[nod] == nod_curent) continue;

        tata[nod_curent] = nod;
        DFS(nod_curent, tata);
    }
}

void parcurgere (int nod, int suma, vector<int> tata, vector<int>&val, vector<int>&cnt)
{
    for (int i = 0; i < A[nod].size(); i++)
    {
        int nod_curent = A[nod][i];
        if (tata[nod] == nod_curent) continue;

        if (cnt[val[nod_curent]] == nod_curent)
        cnt[val[nod_curent]] = 0;

        val[nod_curent] = val[nod_curent] + suma;

        if (cnt[val[nod_curent]] == 0)
        cnt[val[nod_curent]] = nod_curent;

        parcurgere(nod_curent, suma, tata, val, cnt);
    }
}

int main()
{
    int n, m;
    in >> n >> m;

    vector<int> tata(n + 1), val(n + 1), cnt(Pmax);

    for (int i = 1; i < n; i++)
    {
        int x, y;
        in >> x >> y;

        A[x].push_back(y);
        A[y].push_back(x);
    }

    DFS(1, tata);
    cnt[0] = 1;

    for (int i = 1; i <= m; i++)
    {
        int tip, p, s;
        in >> tip;

        if (tip == 1)
        {
            in >> p >> s;
            val[p] = val[p] + s;
            cnt[val[p]] = p;
            parcurgere(p, s, tata, val, cnt);
        }

        else

        {
            in >> s;
            if (cnt[s] == 0)
                out << -1 << '\n';
            else
                out << cnt[s] << '\n';
        }
    }

    return 0;
}