Cod sursa(job #1357153)

Utilizator CalinCojoFMI Cojocaru Calin George CalinCojo Data 23 februarie 2015 19:49:13
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#include <stack>
using namespace std;

deque <int> cereri[250002],raspunsuri[250002],stiva;
vector <int> vecini[250002];
int viz[250002];

void dfs(int nod){

    int i,x;
    viz[nod] = 1;
    stiva.push_back(nod);
    if(!cereri[nod].empty()){  // daca am cereri la nodul nod ma uit in coada si le pot satisface
        for( i = 0; i < cereri[nod].size(); i++ ){

            x = cereri[nod][i];
            if(stiva.size() > x)
                raspunsuri[nod].push_front(stiva[stiva.size()- 1 - x]);   // cautam al x-lea stramos
            else
                raspunsuri[nod].push_front(0);
        }
    }

    for( i =0; i <vecini[nod].size(); i++){
        if(viz[vecini[nod][i]] == 0){
            dfs(vecini[nod][i]);
        }
    }
    stiva.pop_back();
}

int main()
{
    int n,m,p,q,i = 1;
    ifstream f("stramosi.in",ios::in);
    ofstream g("stramosi.out",ios::out);
    f>>n>>m;
    // lista de adiacenta
    for(i = 1;i <= n ; i++){
        f>>p;
        vecini[p].push_back(i);
    }
    /*
    for(i = 0;i <= n ; i++){
        cout<<i<<" : ";
        for(int j = 0; j <vecini[i].size(); j++)
            cout<<vecini[i][j]<<" ";
        cout<<endl;
    }

    */
    // citesc cererile
    while(m){
        f>>q>>p;
        cereri[q].push_front(p);  // pt fiecare membru p am o lista cu cereri de stramosi
        m--;
    }
    /*
    for(i = 0;i <= n ; i++){
        cout<<i<<" : ";
        for(int j = 0; j <cereri[i].size(); j++)
            cout<<cereri[i][j]<<" ";
        cout<<endl;
    }
    */

    dfs(0);
    f.close();
    ifstream h("stramosi.in",ios::in);
    h>>n>>m;

     for(i = 1;i <= n ; i++){
        h>>p;
    }

    while(m){
        h>>q>>p;
        g<<raspunsuri[q].back()<<" ";
        raspunsuri[p].pop_back();
        m--;
    }
    return 0;
}