Cod sursa(job #2513341)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 22 decembrie 2019 22:01:58
Problema Arbore Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 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, SqMax = 400;

int N, K, M, V[NMax + 5], A[NMax + 5], First[NMax + 5], Last[NMax + 5], Start[NMax + 5], Stop[NMax + 5], Lazy[NMax + 5];
vector <int> G[NMax + 5];
bitset <XMax + 5> E[SqMax + 5];

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

    for(auto Vecin : G[Nod])
        if(Vecin != Tata)
            DFS(Vecin, Nod);

    Last[Nod] = K;
}

void Update(int val, int st, int dr)
{
    for(int i = 1; i <= K; i++)
    {
        if(dr < Start[i] || Stop[i] < st)
            continue;

        if(st <= Start[i] && Stop[i] <= dr)
        {
            Lazy[i] += val;
            continue;
        }

        int Low = max(Start[i], st), High = min(Stop[i], dr);

        for(int j = Low; j <= High; j++)
        {
            E[i][A[j]] = 0;
            A[j] += val;
        }

        for(int j = Start[i]; j <= Stop[i]; j++)
            E[i][A[j]] = 1;
    }
}

int Query(int s)
{
    for(int i = 1, val; i <= K; i++)
    {
        val = s - Lazy[i];

        if(val < 0) continue;
        if(E[i][val] == 0) continue;

        for(int j = Start[i]; j <= Stop[i]; j++)
            if(A[j] == val)
                return V[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 = sqrt(N); K = 0;

    for(int i = 1; i <= N; i += lung)
    {
        K++;
        Start[K] = i, Stop[K] = min(i + lung - 1, N);
        E[K][0] = 1;
    }

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

        if(t == 1)
        {
            fin >> p >> s;
            Update(s, First[p], Last[p]);
        }
        else
        {
            fin >> s;
            fout << Query(s) << '\n';
        }
    }
    fin.close();
    fout.close();

    return 0;
}