Cod sursa(job #1386075)

Utilizator laurenttlaurentiu pavel laurentt Data 12 martie 2015 17:56:27
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<vector>
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;

int stack[250005];
int actual[300005];
vector<int> ancestors;
vector<int> descendants[250005];

vector<int> queryInOrder;
vector<int> query   [300005];
vector<int> solution[300005];

void dfs(int pos, int depth) {
  //  cout << "pos:" << pos << " depth" << depth << " -> ";
    stack[depth] = pos;
  int q_size = query[pos].size();
  for(int i = 0; i < q_size; ++i) {
    //cout << "qPos:" << query[pos][i] << " val:";
    if(query[pos][i] >= depth) {
      //cout << "0";
      solution[pos].push_back(0);
    }
    else {
      //cout << stack[depth - query[pos][i]];
      solution[pos].push_back(stack[depth - query[pos][i]]);
    }
  }
  //  cout << "\n";
  
  int d_size = descendants[pos].size();
  for(int i = 0; i < d_size; ++i) {
    dfs(descendants[pos][i], depth + 1);
  }
}

int main() {
  ifstream fin ("stramosi.in");
  ofstream fout("stramosi.out");
  
  int N,M;
  fin >> N >> M;
  
  vector<int> zeros;

  ancestors.push_back(0);

  for(int i = 1; i <= N; ++i) {
    int x; fin >> x;
    ancestors.push_back(x);
    descendants[x].push_back(i);

    if(x == 0) {
      zeros.push_back(i);
    }
  }
  for(int i = 0; i < M; ++i) {
    int P,Q; fin >> Q >> P;
    query[Q].push_back(P);
    queryInOrder.push_back(Q);
  }

  int z_size = zeros.size();
  //  cout << "zsize:" << z_size << "\n";

  for(int i = 0; i < z_size; ++i) {
    //cout << "zeros[i]:" << zeros[i] << "\n";
    dfs(zeros[i], 1);
  }
  
  //  cout << "out\n";
  
  for(int i = 0; i < M; ++i) {
    //    cout << "queryInOrder[i]:" << queryInOrder[i] << " actual[queryInOrder[i]]:"
    //	 << actual[queryInOrder[i]] << endl;
    fout << solution[queryInOrder[i]][actual[queryInOrder[i]]++] << '\n';
    //  cout << "afterplus:" << actual[queryInOrder[i]] << endl;
  }
  
  return 0;
}