Cod sursa(job #480317)

Utilizator freak93Adrian Budau freak93 Data 27 august 2010 14:08:18
Problema Arbore Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.8 kb
#include<fstream>
#include<vector>
#include<bitset>

using namespace std;

const char iname[]="arbore.in";
const char oname[]="arbore.out";
const int maxn=100005;
const int maxs=1000005;
const int maxq=320;

ifstream f(iname);
ofstream g(oname);

int start[maxn],finish[maxn],a[maxn],who[maxn],r,k,bonus[maxq],n,m,i,x,y;
vector<int> E[maxn];
bitset<maxs> pos[maxq];

void dfs(int x)
{
    if(start[x])
        return;
    start[x]=++r;
    a[r]=0;who[r]=x;
    for(vector<int>::iterator it=E[x].begin();it!=E[x].end();++it)
        dfs(*it);
    finish[x]=r;
}

int query(int x)
{
    for(int i=1;i<=k;++i)
        if(bonus[i]<=x&&pos[i][x-bonus[i]]==1)
        {
            for(int j=maxq*(i-1)+1;j<=maxq*i;++j)
                if(a[j]==x-bonus[i])
                    return who[j];
        }
    return -1;
}

void update(int group,int start,int finish,int v)
{
    for(int i=start;i<=finish;++i)
        pos[group][a[i]]=0,a[i]+=v;
    for(int i=(group-1)*maxq+1;i<=group*maxq&&i<=n;++i)
        pos[group][a[i]]=1;
}

void update(int start,int finish,int v)
{
    int groups=(start-1)/maxq+1,groupf=(finish-1)/maxq+1;
    if(groups!=groupf)
    {
        update(groups,start,groups*maxq,v);
        update(groupf,(groupf-1)*maxq+1,finish,v);
        for(int i=groups+1;i<groupf;++i)
            bonus[i]+=v;
        return;
    }
    update(groups,start,finish,v);
}

int main()
{
    f>>n>>m;
    for(i=1;i<n;++i)
        f>>x>>y,E[x].push_back(y),E[y].push_back(x);
    dfs(1);
    k=(n-1)/maxq+1;
    for(i=1;i<=k;++i)
        pos[i][0]=1;
    while(m--)
    {
        f>>x;
        if(x==1)
        {
            f>>x>>y;
            update(start[x],finish[x],y);
            continue;
        }
        f>>y;
        g<<query(y)<<"\n";
    }
}