Pagini recente » Atasamentele paginii Clasament 77 | Cod sursa (job #2006847) | Cod sursa (job #1844771) | Cod sursa (job #2080645) | Cod sursa (job #471504)
Cod sursa(job #471504)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<fstream>
#define maxstr 19
using namespace std;
int n,m;
vector<int> v[250001];
int stramosi[maxstr][250001];
void df2(int);
void df1()
{
for(int i=1;i<=n;i++)
{
if(stramosi[0][i]==0)
df2(i);
}
}
void df2(int rad)
{
int i,j;
if(stramosi[0][rad]!=0)
{
int curent;
curent=stramosi[0][rad];
if(curent!=0)
{
for(j=1;j<maxstr;j++)
{
stramosi[j][rad]=stramosi[j-1][curent];
curent=stramosi[j][rad];
if(curent==0)
break;
}
}
}
for(i=0;i<(int) v[rad].size();i++)
df2(v[rad][i]);
}
int main()
{
int stramos,nrbiti;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
memset(stramosi,0,sizeof(stramosi));
in>>n>>m;
for(int i=1;i<=n;i++)
{
in>>stramos;
if(stramos)
v[stramos].push_back(i);
stramosi[0][i]=stramos;
}
//Preprocess the matrix
df1();
nrbiti=8*sizeof(int)-1;//platform independent code
for(int i=1;i<=m;i++)
{
int p,q;
in>>q>>p;
int contor=nrbiti;
stramos=q;
while(contor>=0)
{
if(p&(1<<contor))
stramos=stramosi[contor][stramos];
contor--;
if(stramos==0)
break;
}
out<<stramos<<"\n";
}
in.close();
out.close();
return 0;
}