Cod sursa(job #1749965)

Utilizator Bodo171Bogdan Pop Bodo171 Data 29 august 2016 13:11:04
Problema Arbore Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.73 kb
#include <iostream>
#include<fstream>
#include<cmath>
#include<vector>
#include<bitset>
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;
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;
}
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));
}
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;
        }
    }
}
bool finds()
{
    for(int ind=0;ind<h[nr].size();ind++)
        if(h[nr][ind].first==idx) return true;
    return false;
}
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);
    }
}
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+1;
            continue;
        }
        del(val[indi],buc[indi]);
        val[indi]+=value;
        ins(val[indi],buc[indi],1);
    }
}
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;
}
int main()
{
    ifstream f("arbore.in");
    ofstream g("arbore.out");
    f>>n>>m;
    for(i=1;i<=n-1;i++)
    {
        f>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1);
    make_pieces();
    for(i=1;i<=m;i++)
    {
        f>>tip;
        if(tip==1)
        {
            f>>x>>value;
            stanga=st[x];
            dreapta=dr[x];
            update();
        }
        else
        {
            f>>x;
            g<<query()<<'\n';
        }
    }
    return 0;
}