Cod sursa(job #1310504)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 6 ianuarie 2015 22:10:04
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<fstream>
#include<queue>
#include<vector>
using namespace std;
ifstream in("arbore.in");
ofstream out("arbore.out");
const int NMAX = 100000;
const int DMAX = NMAX * 10;

struct ang{
    int number;
    int sum;
};
vector<int> v[NMAX + 10];
vector<ang> hash[DMAX +10];
int tata[NMAX + 10],n,m,s,p,c[NMAX + 10];

void init_tata(int x)
{

    queue<int> coada;
    coada.push(x);
    while(!coada.empty()){
        int k = coada.front();
        for(int i = 0 ; i < v[k].size() ; i++)
            if(tata[v[k][i]] == 0){

                tata[v[k][i]] = k;
                coada.push(v[k][i]);
            }
        coada.pop();
    }
}

void in_hash(int nod,int val)
{

    ang nou;
    nou.number = nod;
    nou.sum = val;
    hash[nou.sum].push_back(nou);
}

void scoate(int nod,int val)
{

    for(int i = 0 ; i < hash[val].size() ; i++)
        if(hash[val][i].number == nod)
            hash[val].erase(hash[val].begin() + i);
}

int query(int val)
{

    if(hash[val].size() == 0)
        return -1;
    return hash[val][0].number;
}

void citire()
{

    in>>n>>m;
    int a,b;
    for(int i = 1 ; i < n ;i++){
        in>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
        in_hash(i,0);
    }
    in_hash(n,0);
    tata[1] = -1;
    init_tata(1);
}

void act(int nod,int suma)
{

    scoate(nod,c[nod]);
    c[nod] += suma;
    in_hash(nod,c[nod]);
    for(int i = 0 ; i < v[nod].size() ; i++)
        if(tata[v[nod][i]] == nod)
            act(v[nod][i],suma);
}

int main()
{

    citire();
    int tip,a,b;
    for( ; m ; --m){
        in>>tip;
        if(tip == 1){
            in>>a>>b;
            act(a,b);
        }
        else{
            in>>a;
            out<<query(a)<<"\n";
        }
    }
    return 0;
}