Cod sursa(job #1749980)

Utilizator Bodo171Bogdan Pop Bodo171 Data 29 august 2016 13:35:41
Problema Arbore Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 3.14 kb
#include <iostream>
#include<fstream>
#include<cmath>
#include<vector>
#include<bitset>
#include<string>
using namespace std;
const int nmax=100005;
vector< pair<int,int> >h[10*nmax];
vector<int> v[nmax];
bitset<nmax> viz;
struct smen
{
    int l,r,add;
}a[405];
int rep[nmax],st[nmax],dr[nmax],buc[nmax],val[nmax];
int ind,idx,i,n,m,k,bucata,x,y,nr,stanga,dreapta,value,indice,tip,indi,num,c;
string str;
inline void dfs(int x)
{
    viz[x]=1;
    k++;
    rep[k]=x;
    st[x]=k;
    for(int i=0;i<v[x].size();i++)
    {
        if(!viz[v[x][i]])
            dfs(v[x][i]);
    }
    dr[x]=k;
}
inline void ins(int x,int b,int frecv)
{
    for(int ind=0;ind<h[x].size();ind++)
    {
        if(h[x][ind].first==b)
        {
            h[x][ind].second+=frecv;
            return;
        }
    }
    h[x].push_back(make_pair(b,frecv));
}
inline void del(int x,int b)
{
    for(int ind=0;ind<h[x].size();ind++)
    {
        if(h[x][ind].first==b)
        {
            h[x][ind].second--;
            if(h[x][ind].second==0)
            {
                h[x][ind]=h[x].back();
                h[x].pop_back();
            }
            return;
        }
    }
}
inline bool finds()
{
    for(int ind=0;ind<h[nr].size();ind++)
        if(h[nr][ind].first==idx) return true;
    return false;
}
inline void make_pieces()
{
    bucata=floor(sqrt(n));
    for(i=1;i<=n;i++)
    {
        buc[i]=i/bucata+1;
        if(a[buc[i]].l==0) a[buc[i]].l=i;
        a[buc[i]].r=i;
    }
    for(i=1;i<=buc[n];i++)
    {
        ins(0,i,a[i].r-a[i].l+1);
    }
}
inline void update()
{
    for(indi=stanga;indi<=dreapta;indi++)
    {
        if(a[buc[indi]].l>=stanga&&a[buc[indi]].r<=dreapta)
        {
            a[buc[indi]].add+=value;
            indi=a[buc[indi]].r;
            continue;
        }
        del(val[indi],buc[indi]);
        val[indi]+=value;
        ins(val[indi],buc[indi],1);
    }
}
inline int query()
{
    for(idx=1;idx<=buc[n];idx++)
    {
        nr=x-a[idx].add;
        if(nr>=0)
         if(finds())
        {
            for(indice=a[idx].l;indice<=a[idx].r;indice++)
            {
                if(val[indice]==nr)
                    return rep[indice];
            }
        }
    }
    return -1;
}
inline int getnum()
{
    num=0;
    while(str[c]>='0'&&str[c]<='9')
    {
        num=num*10+str[c]-'0';
        c++;
    }
    c++;
    return num;
}
int main()
{
    ifstream f("arbore.in");
    ofstream g("arbore.out");
    getline(f,str);
    n=getnum();m=getnum();
    for(i=1;i<=n-1;i++)
    {
        getline(f,str);
        c=0;
        x=getnum();y=getnum();
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1);
    make_pieces();
    for(i=1;i<=m;i++)
    {
        getline(f,str);
        c=0;
        tip=getnum();
        if(tip==1)
        {
            x=getnum();
            value=getnum();
            stanga=st[x];
            dreapta=dr[x];
            update();
        }
        else
        {
            x=getnum();
            g<<query()<<'\n';
        }
    }

    return 0;
}