Cod sursa(job #788654)

Utilizator S7012MYPetru Trimbitas S7012MY Data 15 septembrie 2012 15:33:30
Problema Arbore Scor 95
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#define DN 100005
#define SQ 450
#define DV 200005
using namespace std;

typedef vector<int>::iterator it;

int n,m,eu[DN*2],f[DN],l[DN],v[DN*2],buc[SQ],sz;
char am[SQ][DV];
vector<vector<int> >gr;

void dfs(int &s, int &fa) {
    eu[++sz]=s;
    f[s]=sz;
    for(it i=gr[s].begin();i!=gr[s].end(); ++i) if(*i!=fa) dfs(*i,s);
    eu[++sz]=s;
    l[s]=sz;
}

void update(int nod,int suma) {
    for(int a=1,b=SQ,ib=0; a<=sz;a=b+1,b+=SQ,++ib) {
        if(f[nod]>b || l[nod]<a) continue;
        if(f[nod]<=a && l[nod]>=b) {
            buc[ib]+=suma;
            continue;
        }
        int lim=min(b,sz);
        for(int i=a; i<=lim; ++i) am[ib][v[i]]=0;
        lim=min(l[nod],b);
        for(int i=max(a,f[nod]);i<=lim; ++i) v[i]+=suma;
        lim=min(b,sz);
        for(int i=a; i<=lim; ++i) am[ib][v[i]]=1;
    }
}

int cauta(int a,int b, int vl) {
    for(int i=a; i<=b; ++i) if(v[i]==vl) return eu[i];
    return -1;
}

int query(int suma) {
    for(int a=1,b=SQ,ib=0; a<=sz;a=b+1,b+=SQ,++ib) {
        int vl=suma-buc[ib];
        if(vl>=0 && am[ib][vl]) return cauta(a,min(b,sz),vl);
    }
    return -1;
}

int main()
{
    ifstream f("arbore.in");
    ofstream g("arbore.out");
    f>>n>>m;
    gr.resize(n+1);
    for(int i=1; i<n; ++i) {
        int a,b;
        f>>a>>b;
        gr[a].push_back(b);
        gr[b].push_back(a);
    }
    int c=1,b=0;
    dfs(c,b);

    for(int i=0; i<m; ++i) {
        int op,a,b;
        f>>op;
        if(op==1) {
            f>>a>>b;
            update(a,b);
        }else {
            f>>a;
            g<<query(a)<<'\n';
        }
    }
    return 0;
}