Cod sursa(job #341180)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 17 august 2009 17:54:25
Problema Arbore Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.85 kb
#include <stdio.h>
#include <vector>
#include <math.h>
#include <string.h>

using namespace std;

#define maxn 100010
#define mrad 340
#define maxnr 1000410
#define pb push_back

long n, i, j, k, m, a, b, rad, poz, nr, tip, cat, l;
long st[maxn], dr[maxn], parc[maxn], f[maxnr], be[mrad], en[mrad], val[maxn];
long ad[mrad], qq[mrad][maxnr/30];
vector<long> v[maxn];

long max(long a, long b)
{
    if(a<b) return b;
    return a;
}

long min(long a, long b)
{
    if(a<b) return a;
    return b;
}

void df(long nod)
{
    long y, fiu;
    f[nod]=1;
    st[nod]=l+1;
    for(y=0; y<v[nod].size(); y++)
    {
        fiu=v[nod][y];
        if(f[fiu]==0) df(fiu);
    }
    parc[++l]=nod;
    dr[nod]=l; 
}   

void update(long nod, long cat)
{
    long left=st[nod];
    long right=dr[nod];
    long i, j;
    for(i=1; i<=nr; i++)
    {
        if(left<=be[i] && en[i]<=right)
        {
            ad[i]+=cat;
        }
        else
        if((be[i]<=left && left<=en[i]) || (be[i]<=right && right<=en[i]))
        {               
            for(j=be[i]; j<=en[i]; j++)
            {
                f[val[j]]=f[val[j]+cat]=0;
            }
            for(j=be[i]; j<=en[i]; j++)
            {
                f[val[j]]++;
            }
            for(j=max(be[i], left); j<=min(right, en[i]); j++)
            {
                f[val[j]]--;
                if(f[val[j]]==0)
                {
                    qq[i][val[j]/30]-=(1<<(val[j]%30));
                }
                val[j]+=cat;
                f[val[j]]++;
                if(f[val[j]]==1)
                {
                    qq[i][val[j]/30]+=(1<<(val[j]%30));
                }
            }            
        }
    }
}

long querry(long cat)
{
    long caut=0;
    for(i=1; i<=nr; i++)
    {
        caut=cat-ad[i];
        if(((qq[i][caut/30])>>(caut%30))&1)
        {
            for(j=be[i]; j<=en[i]; j++)
            {
                if(val[j]==caut)
                {
                    return parc[j];
                }
            }
        }
    }
    return -1;
}     

int main()
{
    freopen("arbore.in", "r", stdin);
    freopen("arbore.out", "w", stdout);
    scanf("%d%d", &n, &m);
    rad=(long)sqrt(n);
    for(i=1; i<n; i++)
    {
        scanf("%d%d", &a, &b);
        v[a].pb(b);
        v[b].pb(a);
    }
    df(1);
    for(i=1, poz=rad; poz<n; poz+=rad, i++)
    {
        be[i]=poz-rad+1;
        en[i]=poz;
        qq[i][0]=1;
    }
    be[i]=poz-rad+1;
    en[i]=n;
    qq[i][0]=1;
    nr=i;
    while(m--)
    {
        scanf("%d", &tip);
        if(tip==1)
        {
            scanf("%d%d", &a, &cat);
            update(a, cat);
        }
        else
        {
            scanf("%d", &cat);
            printf("%d\n", querry(cat));
        }
    }
    return 0;
}