Pagini recente » Cod sursa (job #1626146) | Cod sursa (job #1208161) | Cod sursa (job #1362584) | Cod sursa (job #983372) | Cod sursa (job #471448)
Cod sursa(job #471448)
#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[250001][maxstr];
void df2(int);
void df1()
{
for(int i=1;i<=n;i++)
{
if(stramosi[i][0]==0)
df2(i);
}
}
void df2(int rad)
{
int i,j;
if(stramosi[rad][0]!=0)
{
int curent;
curent=stramosi[rad][0];
stramosi[rad][1]=stramosi[curent][0];
curent=stramosi[rad][1];
if(curent!=0)
{
for(j=2;j<maxstr;j++)
{
stramosi[rad][j]=stramosi[curent][1];
curent=stramosi[rad][j];
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[i][0]=stramos;
}
//Preprocess the matrix
df1();
nrbiti=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[stramos][contor];
contor--;
if(stramos==0)
break;
}
out<<stramos<<"\n";
}
in.close();
out.close();
return 0;
}