Cod sursa(job #2786883)

Utilizator marcumihaiMarcu Mihai marcumihai Data 21 octombrie 2021 21:15:10
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Lista lui wefgef Marime 2.29 kb
#include <bits/stdc++.h>

using namespace std;

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

int  n,q;
vector <int> v[100005];
int radical[500];
bitset <500> fr[100005];
int a[100005];
int cont;
int inceput[100005];
int sfarsit[100005];
int x;

int val[100005];



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

}
void update(int st, int dr, int valoare)
{
    int cadran=(st-1)/x+1;

    for(int i=(cadran-1)*x+1 ; i<=cadran*x; ++i)
        fr[cadran][val[i]]=0;

    for(int i=st; i<=dr && i<=cadran*x; ++i)
        val[i]+=valoare;

    for(int i=(cadran-1)*x+1 ; i<=cadran*x; ++i)
        fr[cadran][val[i]]=1;

    if(cadran==(dr-1)/x+1)
        return ;

    int cadran2=(dr-1)/x+1;

    for(int i=cadran+1; i<=cadran2; ++i)
        radical[i]+=valoare;

    for(int i=(cadran2-1)*x+1 ; i<=cadran2*x; ++i)
        fr[cadran2][val[i]]=0;

    for(int i=(cadran2-1)*x+1 ; i<=dr; ++i)
        val[i]+=valoare;

    for(int i=(cadran2-1)*x+1 ; i<=cadran2*x; ++i)
        fr[cadran2][val[i]]=1;


}












int main()
{
    f>>n>>q;
    for(int i=1; i<n; ++i)
    {
        int a, b;
        f>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);

    }
    x=sqrt(n);

    DFS(1, 0);


    for(int query=1; query<=q; ++query)
    {
        int tip;
        f>>tip;
        if(tip==1)
        {
            int sursa, valoare;
            f>>sursa>>valoare;
            update(inceput[sursa], sfarsit[sursa], valoare);
        }
        if(tip==2)
        {
            int vali;
            f>>vali;
            int ok=0;
            for(int i=1; i<=n/x+1; ++i)
            {
                if(ok==1)
                    break;
                int dif=vali-radical[i];
                if(fr[i][dif]==1 && ok==0)
                {
                    for(int j=(i-1)*x+1; j<=i*x; ++j)
                        if(val[j]==dif && ok==0)
                        {
                            g<<a[j]<<"\n";
                            ok=1;
                        }
                }
            }
        }
    }



    return 0;
}