Cod sursa(job #581970)

Utilizator DraStiKDragos Oprica DraStiK Data 14 aprilie 2011 19:21:43
Problema Arbore Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <algorithm>
#include <vector>
#include <bitset>
using namespace std;

#define pb push_back

#define MAX 1000005
#define DIM 100005
#define SQRT 325

int fs[DIM],ls[DIM],eul[DIM],v[DIM],arb[SQRT];
bitset <MAX> f[SQRT];
vector <int> g[DIM];
bool viz[DIM];
int N,M,P;

void read ()
{
    int i,x,y;

    scanf ("%d%d",&N,&M);
    for (i=1; i<N; ++i)
    {
        scanf ("%d%d",&x,&y);
        g[x].pb (y);
        g[y].pb (x);
    }
}

void df (int nod)
{
    vector <int> :: iterator it;
    int nrP;

    viz[nod]=1;
    ++P; eul[P]=nod; fs[nod]=P; nrP=P;
    for (it=g[nod].begin (); it!=g[nod].end (); ++it)
        if (!viz[*it])
            df (*it);
    ls[nod]=P;
}

void update (int st,int dr,int val)
{
    int i;

    for (i=st; i<=min (SQRT*(st/SQRT+1)-1,dr); ++i)
        f[st/SQRT][v[i]]=0;
    for (i=st; i<=min (SQRT*(st/SQRT+1)-1,dr); ++i)
        v[i]+=val;
    for (i=max ((st/SQRT)*SQRT,1); i<=min (SQRT*(st/SQRT+1)-1,N); ++i)
        f[st/SQRT][v[i]]=1;

    if (st/SQRT!=dr/SQRT)
    {
        for (i=max (SQRT*(dr/SQRT),st); i<=dr; ++i)
            f[dr/SQRT][v[i]]=0;
        for (i=max (SQRT*(dr/SQRT),st); i<=dr; ++i)
            v[i]+=val;
        for (i=max ((dr/SQRT)*SQRT,1); i<=min (SQRT*(dr/SQRT+1)-1,N); ++i)
            f[dr/SQRT][v[i]]=1;
    }

    for (i=st/SQRT+1; i<dr/SQRT; ++i)
        arb[i]+=val;
}

inline int query (int val)
{
    int i,j;

    for (i=0; i<=N/SQRT; ++i)
        if (val-arb[i]>=0 && f[i][val-arb[i]])
            break ;

    for (j=max (i*SQRT,1); j<=min ((i+1)*SQRT-1,N); ++j)
        if (v[j]==val-arb[i])
            return eul[j];

    return -1;
}

void solve ()
{
    int i,tip,x,y;

    df (1);
    for (i=1; i<=M; ++i)
    {
        scanf ("%d",&tip);

        if (tip==1)
        {
            scanf ("%d%d",&x,&y);
            update (fs[x],ls[x],y);
        }
        else
        {
            scanf ("%d",&x);
            printf ("%d\n",query (x));
        }
    }
}

int main ()
{
    freopen ("arbore.in","r",stdin);
    freopen ("arbore.out","w",stdout);

    read ();
    solve ();

    return 0;
}