Pagini recente » Cod sursa (job #1541904) | Cod sursa (job #887356) | Cod sursa (job #3235443) | Cod sursa (job #470001) | Cod sursa (job #682573)
Cod sursa(job #682573)
#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;
}