Cod sursa(job #418673)

Utilizator dead_knightTitei Paul Adrian dead_knight Data 16 martie 2010 11:08:14
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#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);
    }
}