Cod sursa(job #2833206)

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

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

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


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;

    for(int i=st; i<=min(dr, bucketst*rad-1); ++i)
    {
        int x=valoare[i];
        valoare[i]+=sum;
        if(m[bucketst-1][x]>0)
            m[bucketst-1][x]--;

        m[bucketst-1][x+sum]++;

    }
    for(int i=bucketst; i<=bucketdr; ++i)
        radical[i]+=sum;
    for(int i=(bucketdr+1)*rad; i<=dr; ++i)
    {
        int x=valoare[i];
        valoare[i]+=sum;
        if(m[bucketdr+1][x]>0)
            m[bucketdr+1][x]--;

        m[bucketdr+1][x+sum]++;
    }

}

int Query(int suma)
{

    for(int i=0; i<=n/rad+1; ++i)
    {
        int s=radical[i];
        if(m[i][suma-s]>0)
        {
            for(int j=rad*i; j<=min(n, rad*(i+1)); ++j)
                if(valoare[j]==suma-s)
                    return j;
        }
    }
    return -1;

}


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;
}