Cod sursa(job #2833191)

Utilizator marcumihaiMarcu Mihai marcumihai Data 14 ianuarie 2022 21:22:14
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Lista lui wefgef Marime 1.76 kb
#include <bits/stdc++.h>
#define rad 355
using namespace std;

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

int a[100005];
vector <int> v[100005];
int radical[360];
map <int, int> m[360];
int n;
int q;
int lung;
int sfarsit[100005];
int valoare[100005];
int inceput[100005];


void DFS(int nod, int tata)
{
    a[++lung]=nod;
    inceput[nod]=lung;
    for(int x=0; x<v[nod].size(); ++x)
    {
        int fiu=v[nod][x];

        if(fiu!=tata)
            DFS(fiu, nod);

    }

    sfarsit[nod]=lung;

}

void Update(int st, int dr, int sum)
{
    int bucketst=st/rad+1;
    int bucketdr=dr/rad;
    if(st==2)
    {
        cout<<"YES";
    }
    for(int i=st; i<=min(dr , bucketst*rad-1); ++i)
    {
        int x=valoare[i];
        valoare[i]+=sum;
        m[bucketst-1][x]=0;
        m[bucketst-1][x+sum]=i;
    }
    for(int i=bucketst;i<=bucketdr;++i)
        radical[i]+=sum;
    for(int i=(bucketdr+1)*rad;i<=dr;++i)
    {
        int x=valoare[i];
        m[bucketdr+1][x]=0;
        m[bucketdr+1][x+sum]=i;
    }

}

int Query(int suma)
{
    for(int i=0;i<=n/rad+1;++i)
    {
        int s=radical[i];
        if(m[i][suma-s]!=0)
            return m[i][suma-s];
    }
}


int main()
{
    f>>n>>q;
    for(int i=1; i<n; ++i)
    {
        int x, y;
        f>>x>>y;
        v[x].push_back(y);
    }
    DFS(1, 0);




    for(int query=1; query<=q; ++query)
    {
        int t;
        f>>t;
        if(t==1)
        {
            int nod, suma;
            f>>nod>>suma;
            Update(inceput[nod], sfarsit[nod], suma);

        }
        if(t==2)
        {
            int suma;
            f>>suma;
            g<<Query(suma)<<"\n";
        }
    }

    return 0;
}