Cod sursa(job #274220)

Utilizator mariussMarius Telespan mariuss Data 9 martie 2009 15:35:35
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<stdio.h>
#include<math.h>
#include<vector>
#define nmax 100010
using namespace std;

vector <int> v[nmax];

int nr, rang[nmax],w[nmax],buc[150],partial[nmax],el[nmax],ele[nmax];

void dfs(int a,int r)
{
    w[nr++]=a;
    rang[a]=r+1;
    ele[a]=el[a];
    for(int i=0;i<el[a];i++)
    {
        dfs(v[a][i],r+1);
        ele[a]+=ele[v[a][i]];
    }
}

int main()
{
    int i,j,k,s,bucata,n,m,a,b,cod,sef,q;
    freopen("arbore.in","r",stdin);
    freopen("arbore.out","w",stdout);
    
    scanf("%d %d",&n,&m);
    
    for(i=1;i<n;i++)
    {
        scanf("%d %d",&a,&b);
        v[a].push_back(b);
        el[a]++;
    }
    
    dfs(1,0);    
    
    bucata=int(sqrt(n));
    
    for(int f=1;f<=m;f++)
    {
        scanf("%d",&cod);
        if (cod==1)
        {
            scanf("%d %d",&sef,&s);
            for(i=0;i<n;i++)
                if(w[i]==sef) break;
            partial[i]+=s;
            q=ele[sef];
            for(j=i+1;j<bucata*((i/bucata)+1) && rang[j]>rang[i] ;j++, q-- )
                partial[j]+=s;
            if(j==bucata*((i/bucata)+1))
            {
                for(j=bucata*((i/bucata)+1)+1 ; q>0 ;j++,q--)
                {
                    if(rang[j]==rang[i]) break;
                    if(j%bucata==0)
                        buc[j/bucata-1]+=s;
                }
                for(k=bucata*(j/bucata);q>0;k++,q--)
                    partial[k]+=s;
            }
            
        }
        
        else
        {
            scanf("%d",&s);
            for(i=0;i<n;i++)
            {
                if(partial[i]+buc[i/bucata]==s)
                {
                    printf("%d\n",w[i]);
                    break;
                }
            }
            if(i==n)printf("-1\n");
        }
    }
    
    return 0;
}