Pagini recente » Cod sursa (job #2332371) | Cod sursa (job #2005899) | Cod sursa (job #1023044) | Cod sursa (job #131743) | Cod sursa (job #1425979)
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#include <stack>
#include <bitset>
#define MAX 250001
using namespace std;
vector <unsigned int> cereri[ MAX ], vecini [ MAX ] , stiva ,raspunsuri [ MAX ];
bitset <1> viz[ 250002 ];
void mod_dfs ( int nd){
vector < unsigned int > stiva_dfs ;
unsigned int curr_nd ;
int i;
stiva_dfs.push_back ( nd );
viz [ nd ] = 1;
while ( stiva_dfs.size() ){
curr_nd = stiva_dfs.back() ;
//daca am vreo cerere pt nd current
if ( cereri [ curr_nd ].size () ){
for ( i = cereri [ curr_nd ].size () - 1 ; i >= 0 ; i-- ){
if ( cereri [ curr_nd ] [ i ] >= stiva_dfs.size () )
raspunsuri [ curr_nd ].push_back( 0 );
else
raspunsuri [ curr_nd ] . push_back ( stiva_dfs [ stiva_dfs.size () - cereri [ curr_nd] [ i ] - 1 ] ) ;
}
}
if ( vecini [ curr_nd ].size () ) {
stiva_dfs.push_back ( vecini [ curr_nd ].back() );
vecini [ curr_nd ].pop_back() ;
}
else{
stiva_dfs.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 );
}
// citesc cererile
while( m ){
f>>q>>p;
cereri[ q ].push_back( p ); // pt fiecare membru p am o lista cu cereri de stramosi
m--;
}
f.close ();
mod_dfs ( 0 );
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()<<"\n";
cereri [ q ].pop_back() ;
}
return 0;
}