Pagini recente » Cod sursa (job #1454826) | Cod sursa (job #1206215) | Cod sursa (job #2893938) | Cod sursa (job #2725875) | Cod sursa (job #418673)
Cod sursa(job #418673)
#include<fstream>
#include<cstdio>
#include<vector>
#include<algorithm>
#define MAX 250004
#define MAXM 300005
#define pb push_back
#define capat i
#define info i
#define index q
using namespace std;
struct nod{
int i;
nod *next;
};
struct intrebare{
int p,q;
};
nod *G[MAX], *rad;
int n,m, r[MAXM], nivel[MAX], viz[MAX], niv;
intrebare v[MAXM];
vector<intrebare> Q[MAX];
void addmuchie(int x, int y);
void citire();
void dfs(int k)
{
int i;
niv++;
viz[k]=1;
nivel[niv]=k;
for(i=0; i<Q[k].size(); i++)
{
int index=Q[k][i].index;
int cat=Q[k][i].p;
if(niv-cat>=1)
r[index]=nivel[niv-cat];
}
for(nod *p=G[k]; p ; p=p->next)
if(viz[p->info]==0)
{
dfs(p->info);
}
niv--;
}
int main()
{
int i;
freopen("stramosi.out","w",stdout);
citire();
for(nod *p=rad; p ; p=p->next)
{
for(i=1;i<=n;i++)
nivel[i]=0;
dfs(p->info);
}
for(int i=1;i<=m;i++)
printf("%d ", r[i]);
return 0;
}
void addmuchie(int x, int y)
{
nod *p=new nod;
p->info=y;
p->next=G[x];
G[x]=p;
p=new nod;
p->i=x;
p->next=G[y];
G[y]=p;
}
void citire()
{
int i;
ifstream fin("stramosi.in");
fin>>n>>m;
for(i=1;i<=n;i++)
{
int x;
fin>>x;
if(x==0)
{
nod *p=new nod;
p->info=i;
p->next=rad;
rad=p;
}
else
addmuchie(x,i);
}
for(i=1;i<=m;i++)
{
int x,y;
fin>>x>>y;
v[i].q=x;
v[i].p=y;
intrebare temp;
temp.index=i;
temp.p=y;
Q[x].pb(temp);
}
}