Cod sursa(job #1655482)

Utilizator touristGennady Korotkevich tourist Data 18 martie 2016 00:16:09
Problema Arbore Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <bits/stdc++.h>
#define Nmax 100005
#define pb push_back
#define SQRT 320

using namespace std;

int n,nr_fii[Nmax],p[Nmax],l;
int st[SQRT],dr[SQRT],cnt,val[Nmax],v[Nmax];
vector <int> L[Nmax];

struct buc
{
    bitset <1000001> Viz;
    int sum=0;
} Buc[SQRT];

inline void Dfs(int nod, int tata)
{
    p[nod]=++l; v[l]=nod;
    for(auto it : L[nod])
    {
        if(it==tata) continue;
        Dfs(it,nod);
        nr_fii[nod]+=nr_fii[it]+1;
    }
}

inline void upd(int p, int x, int y, int s)
{
    int i;
    for(i=st[p];i<=dr[p];++i) Buc[p].Viz[val[i]]=0;
    for(i=x;i<=y;++i) val[i]+=s;
    for(i=st[p];i<=dr[p];++i) Buc[p].Viz[val[i]]=1;
}

int main()
{
    int i,j,x,y,m,Sqrt,s,tip,nod,k;
    ifstream cin("arbore.in");
    ofstream cout("arbore.out");
    cin>>n>>m;
    for(i=1;i<n;++i)
    {
        cin>>x>>y;
        L[x].pb(y); L[y].pb(x);
    }
    Dfs(1,0);
    Sqrt=sqrt(1.0*n);
    for(i=1;i<=n;i+=Sqrt)
    {
        st[++cnt]=i; dr[cnt]=min(i+Sqrt-1,n);
    }
    while(m--)
    {
        cin>>tip;
        if(tip==1)
        {
            cin>>nod>>s;
            x=p[nod]; y=p[nod]+nr_fii[nod];
            for(i=1;i<=cnt && st[i]<x;++i);
            for(j=max(i-1,1);j<=cnt && dr[j]<=y;++j);
            --j;
            for(k=i;k<=j;++k) Buc[k].sum+=s;
            if(i-1) upd(i-1,x,min(y,dr[i-1]),s);
            if(j+1<=cnt && (j+1!=i-1 || i==1)) upd(j+1,max(x,st[j+1]),y,s);
        }
        else
        {
            cin>>s;
            for(i=1;i<=cnt;++i)
                if(Buc[i].sum<=s && Buc[i].Viz[s-Buc[i].sum]) break;

            if(i==cnt+1)
                cout<<"-1\n";
            else
            {
                for(j=st[i];j<=dr[i];++j)
                    if(val[j]==s-Buc[i].sum)
                    {
                        cout<<v[j]<<"\n";
                        break;
                    }
            }
        }
    }
    return 0;
}