Cod sursa(job #2423673)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 21 mai 2019 20:30:03
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <cmath>

using namespace std;

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

const int NMax = 1e5, XMax = 1e6, BMax = 320;

int N, K, M, V[NMax + 5], A[NMax + 5], S[NMax + 5], D[NMax + 5], id;
vector <int> G[NMax + 5];

struct
{
    int st, dr, l;
    bitset <XMax + 5> X;
}
B[BMax + 5];

void DFS(int Nod, int Tata)
{
    S[Nod] = ++K, V[++id] = Nod;

    for(auto Vecin : G[Nod])
    {
        if(Vecin == Tata) continue;
        DFS(Vecin, Nod);
    }
    D[Nod] = ++K;
}

inline bool In(int x, int y)///daca x este in subarborele cu radacina y
{
    return (S[y] <= S[x] && D[x] <= D[y]);
}

void Update(int Nod, int val, int i)
{
    bool x = In(V[B[i].st], Nod), y = In(V[B[i].dr], Nod);

    if(x && y) {B[i].l += val; return;}

    for(int j = B[i].st; j <= B[i].dr; j++)
    {
        B[i].X[A[j]] = 0;

        if(In(V[j], Nod))
            A[j] += val;
    }

    for(int j = B[i].st; j <= B[i].dr; j++)
        B[i].X[A[j]] = 1;
}

int Q(int s)
{
    for(int i = 1, val; i <= K; i++)
    {
        val = s - B[i].l;
        if(B[i].X[val] == 0) continue;

        for(int j = B[i].st; j <= B[i].dr; j++)
            if(A[j] == val)
                return j;
    }
    return -1;
}

int main()
{
    fin >> N >> M;

    for(int i = 1, a, b; i < N; i++)
    {
        fin >> a >> b;

        G[a].push_back(b);
        G[b].push_back(a);
    }
    DFS(1, 0);

    int lung = (int)sqrt(N); K = 0;

    for(int i = 1; i <= N; i += lung)
        B[++K].st = i, B[K].dr = min(i + lung - 1, N);

    for(int i = 1, t, p, s; i <= M; i++)
    {
        fin >> t;

        if(t == 1)
        {
            fin >> p >> s;

            for(int k = 1; k <= K; k++)
                Update(p, s, k);
        }
        else
        {
            fin >> s;
            fout << Q(s) << '\n';
        }
    }
    fin.close();
    fout.close();

    return 0;
}