Cod sursa(job #2396931)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 3 aprilie 2019 22:52:10
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <bitset>
#include <cmath>
using namespace std;

ifstream fin ("arbore.in");
ofstream fout("arbore.out");

int n,m,rad,cnt,tip,s,i,j,p,k,ADD[5000],A[100001],v[200001],x;
int st[100001],dr[100001]; /// a[i],b[i] capetele subarborilor cu radacina in i
int bst,bdr; ///buc din care facc parte capetele

bitset <100001> f;
vector <int> l[100001];
bitset <100001> F[5001];

void dfs(int nod){
    f[nod]=1;
    v[++k]=nod;
    st[nod]=k;

    for(int i=0;i<l[nod].size();i++)
        if( f[l[nod][i]]==0 )
            dfs(l[nod][i]);

    ///v[++k]=nod;
    dr[nod]=k;
}

int main(){
    fin>>n>>m;
    for(k=1;k<n;k++){
        fin>>i>>j;
        l[i].push_back(j);
        l[j].push_back(i);
    }
    k=0;
    dfs(1);

    rad=sqrt(n);
    cnt=n/rad+(n%rad!=0);

    for(;m;m--){
        fin>>tip;

        if(tip==1){
            fin>>p>>s;
            bst=st[p]/rad+(st[p]%rad!=0);
            bdr=dr[p]/rad+(dr[p]%rad!=0);

            if(bst==bdr){
                for(i=st[p];i<=dr[p];i++)
                    A[ v[i] ]+=s;

                F[bst].reset();
                for(i=(bst-1)*rad+1;i<=min(bst*rad,n);i++)
                    F[bst][A[ v[i] ]]=1;

            }else{

                for(i=st[p];i<=bst*rad;i++)
                    A[ v[i] ]+=s;

                F[bst].reset();
                for(i=(bst-1)*rad+1;i<=min(bst*rad,n);i++)
                    F[bst][A[ v[i] ]]=1;


                for(i=(bdr-1)*rad+1;i<=dr[p];i++)
                    A[ v[i] ]+=s;

                F[bdr].reset();
                for(i=(bdr-1)*rad+1;i<=min(bdr*rad,n);i++)
                    F[bdr][A[ v[i] ]]=1;


                for(i=bst+1;i<bdr;i++)
                    ADD[i]+=s;
            }

        }else{
            fin>>s;

            for(i=1;i<=cnt;i++)
                if(s-ADD[i]>0)
                    if(F[i][s-ADD[i]]==1){
                        for(j=(i-1)*rad+1;j<=min(i*rad,n);j++){
                            if(A[j]+ADD[i]==s){
                                fout<<v[j]<<"\n";
                                break;
                            }
                        }

                        break;
                    }

            if(i==cnt+1)
                fout<<-1<<"\n";
        }
    }

    return 0;
}