Cod sursa(job #682573)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 19 februarie 2012 10:37:33
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>

#define MAXN 250001

using namespace std;

typedef unsigned int uint32;
typedef vector<vector<int> > Graph;

Graph graph;

int discoveryTimes[MAXN];
int levels[MAXN];
vector<int> vLevels[MAXN];

void DFS(int node, int& time)
{
	stack<pair<int, int> > st;
	
	st.push(make_pair(node,0));
	
	while (!st.empty())
	{
		node = st.top().first;
		const int level = st.top().second;
		
		st.pop();
		
		levels[node] = level;
		
		vLevels[level].push_back(node);
		++time;
		discoveryTimes[node] = time;
		
		
		for (int i=graph[node].size()-1; i>=0; --i)
		{
			st.push(make_pair(graph[node][i], level+1));
		}
	}
}

int Query(const int q, const int p)
{
	if (levels[q] - p < 0)
	{
		return 0;
	}
	
	const int size = vLevels[levels[q]-p].size();
	int i, step=1;
	
	while (step < size)
	{
		step <<= 1;
	}
	
	for (i=0; step; step >>= 1)
	{
		if (i+step < size && discoveryTimes[vLevels[levels[q]-p][i+step]] <= discoveryTimes[q])
		{
			i += step;
		}
	}
	
	return vLevels[levels[q]-p][i];
}

int main()
{
    int n, m;
    //AncestorMatrix matAncestors;
    vector<int> vRoots;
    //vector<int> vFathers;
    fstream fin("stramosi.in", fstream::in);
    fstream fout("stramosi.out", fstream::out);

    fin >> n >> m;
    //cout << n << " " << m << "\n";

    graph.resize(n+1);
    //vFathers.resize(n+1);
    
    for (int i=1; i<=n; ++i)
    {
        int x;
        fin >> x;
        
        if (!x)
        {
            vRoots.push_back(i);
        }
        else
        {
            graph[x].push_back(i);
            //vFathers[i] = x;
        }
    }
    
	int time = 0;
    for (uint32 i=0; i<vRoots.size(); ++i)
    {
       // cout << vRoots[i] << " ";
	   DFS(vRoots[i], time);
    }
	
	/*for (int i=1; i<=n; ++i)
	{
		cout << discoveryTimes[i] << " ";
	}
	cout << "\n";*/
    
    /*for (uint32 i=1; i<=n; ++i)
    {
        cout << i << "-> ";
        for (uint32 j=0; j<graph[i].size(); ++j)
        {
            cout << graph[i][j] << " ";
        }
        cout << "\n";
    }*/
	
	
	/*for (int i=0; vLevels[i].size()!=0; ++i)
	{
		cout << i << "-> ";
		for (uint32 j=0; j<vLevels[i].size(); ++j)
		{
			cout << discoveryTimes[vLevels[i][j]] << " ";
		}
		cout << "\n";
	}*/

    
    for (int i=0; i<m; ++i)
    {
        int p,q;
        
        fin >> q >> p;

        //fout << Query(q, p) << "\n";
    }

    fin.close();
    fout.close();
    return 0;
}