Cod sursa(job #1966753)

Utilizator Radu_GeorgeRadu George Radu_George Data 15 aprilie 2017 15:48:51
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <bits/stdc++.h>
#define pb push_back
#define Nmax 100005
#define SQRT 330

using namespace std;

vector <int> L[Nmax];
int order[Nmax],pos[Nmax],l,nrfii[Nmax],val[Nmax],n;
int st[SQRT],dr[SQRT],nr_buc,sum[SQRT],Sqrt,wh[Nmax];
bitset <1000005> fr[SQRT];

void dfs(int nod, int tata)
{
    order[++l]=nod; pos[nod]=l;
    for(auto it : L[nod])
        if(it!=tata)
        {
            dfs(it,nod);
            nrfii[nod]+=nrfii[it]+1;
        }
}

inline void decompose()
{
    int i,j;
    Sqrt=sqrt(1.0*n);
    for(i=1;i<=n;i+=Sqrt)
    {
        fr[++nr_buc][0]=1;
        st[nr_buc]=i; dr[nr_buc]=min(i+Sqrt-1,n);
        for(j=st[nr_buc];j<=dr[nr_buc];++j)
            wh[j]=nr_buc;
    }
}

inline void Mark(int buc, int b)
{
    for(int i=st[buc];i<=dr[buc];++i)
        fr[buc][val[i]]=b;
}

inline void upd(int Lft, int Rgt, int x)
{
    int i,b1=0,b2;
    for(i=1;i<=nr_buc && dr[i]<=Rgt;++i)
        if(st[i]>=Lft)
        {
            sum[i]+=x;
            if(!b1) b1=i;
            b2=i;
        }
    if(!b1)
    {
        Mark(wh[Lft],0);
        if(wh[Rgt]!=wh[Lft]) Mark(wh[Rgt],0);
        for(i=Lft;i<=Rgt;++i) val[i]+=x;
        Mark(wh[Lft],1);
        if(wh[Rgt]!=wh[Lft]) Mark(wh[Rgt],1);
    }
    if(b1>1 && dr[b1-1]>=Lft)
    {
        Mark(b1-1,0);
        for(i=Lft;i<st[b1];++i) val[i]+=x;
        Mark(b1-1,1);
    }
    if(b2<nr_buc && st[b2+1]<=Rgt)
    {
        Mark(b2+1,0);
        for(i=st[b2+1];i<=Rgt;++i) val[i]+=x;
        Mark(b2+1,1);
    }
}

inline int qry(int S)
{
    int i,j;
    /*for(i=1;i<=nr_buc;++i)
        if(sum[i]<=S && fr[i][S-sum[i]])
            for(j=st[i];j<=dr[i];++j)
                if(val[j]==S-sum[i])
                    return order[j];*/
    for(i=1;i<=n;++i)
        if(sum[wh[i]]+val[i]==S) return order[i];
    return -1;
}

int main()
{
    int m,x,y,i,tip;
    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);
    decompose();
    while(m--)
    {
        cin>>tip>>x;
        if(tip==1)
        {
            cin>>y;
            upd(pos[x],pos[x]+nrfii[x],y);
        }
        else
            cout<<qry(x)<<"\n";
    }
    return 0;
}