Cod sursa(job #1681338)

Utilizator DragosDADDorneanu Dragos - Andrei DragosDAD Data 9 aprilie 2016 13:22:25
Problema Stramosi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>

using namespace std;

struct NodeTree
{
	unsigned int info, dim = 0;
	NodeTree *kids[99];
	NodeTree *father;
};

NodeTree **NodeAdress;

void insert_tree(NodeTree *&root, unsigned int place, unsigned int value)
{
	NodeTree *p = new NodeTree;
	p->info = value;
	if (root == NULL) {
		p->father = NULL;
		root = p;
		NodeAdress[value] = p;
	}
	else {
		p->father = NodeAdress[place];
		NodeAdress[place]->kids[NodeAdress[place]->dim++] = p;
		NodeAdress[value] = p;
	}
}

unsigned int findAncestor(NodeTree *current, unsigned int rank, unsigned int count)
{
	if (current == NULL) {
		return 0;
	}
	if (rank == count) {
		return current->info;
	}
	return findAncestor(current->father, rank, count + 1);
}

int main()
{
	ifstream fin("stramosi.in");
	ofstream fout("stramosi.out");
	unsigned int n, m, x, i, dim = 0, q, p;
	fin >> n >> m;
	NodeTree **root = new NodeTree*[n + 1];
	NodeAdress = new NodeTree*[n + 1];
	for (i = 1; i <= n; ++i) {
		NodeAdress[i] = NULL;
		root[i] = NULL;
	}
	for (i = 1; i <= n; ++i) {
		fin >> x;
		if (x == 0 || dim == 0) {
			++dim;
			root[dim] = new NodeTree;
			root[dim] = NULL;
			insert_tree(root[dim], x, i);
		}
		else {
			insert_tree(root[dim], x, i);
		}
	}
	while (m)
	{
		fin >> q >> p;
		fout << findAncestor(NodeAdress[q]->father, p, 1) << "\n";
		m--;
	}
	delete[] NodeAdress;
	fin.close();
	fout.close();
	return 0;
}