Cod sursa(job #2924074)

Utilizator marcumihaiMarcu Mihai marcumihai Data 24 septembrie 2022 15:18:40
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <bits/stdc++.h>
#define rad 355
using namespace std;

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

int n,q;
vector <int> v[100005];

struct el
{
    int adun;
    map<int, int> m;
};
el a[rad];

int s[100005];
int subarb[100005];
int valoare[100005];
int ord[100005];
int cont;

void DFS(int nod, int tata)
{

    if(s[nod]==0)
    {
        s[nod]=++cont;
        ord[cont]=nod;
    }

    for(int x=0; x<v[nod].size(); ++x)
    {
        int fiu=v[nod][x];
        if(fiu!=tata)
            DFS(fiu, nod);
    }
    if(subarb[nod]==0)
        subarb[nod]=cont;
}

int grupa(int k)
{
    return (k-1)/rad+1;

}

void Update(int st, int dr, int val)
{

    int gs=grupa(st);
    int gf=grupa(dr);
    for(int i=gs+1; i<=gf-1; ++i)
        a[i].adun+=val;

    for(int i=st; i<=min(dr , gs*rad); ++i)
    {
        int p=valoare[i];
        a[gs].m[p]--;
        valoare[i]+=val;
        p=valoare[i];
        a[gs].m[p]++;
    }
    if(gs!=gf)
    for(int i=max(st , (gf-1)*rad+1); i<=dr; ++i)
    {
        int p=valoare[i];
        a[gf].m[p]--;
        valoare[i]+=val;
        p=valoare[i];
        a[gf].m[p]++;
    }

}

int caut(int grupa, int val)
{
    for(int i=(grupa-1)*rad+1; i<=min(grupa*rad, n); ++i)
    {
        int x=ord[i];
        if(valoare[x]==val)
            return ord[i];
    }
}


int Query(int val)
{
    for(int i=1; i<=grupa(n); ++i)
    {
        int x=a[i].adun;
        if(a[i].m[val-x]>0)
        {
            return caut(i, val-x);
        }
    }
    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);
        v[y].push_back(x);
    }
    DFS(1, 0);

    for(int i=1; i<=q; ++i)
    {
        int tip;
        f>>tip;
        if(tip==1)
        {
            int nod, val;
            f>>nod>>val;
            Update(s[nod], subarb[nod], val);

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


    return 0;
}