Cod sursa(job #1520025)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 8 noiembrie 2015 10:57:56
Problema Stramosi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>

using namespace std;
int n,m,ok,v[1005][250005],w[2][250003],a,b,i,j;
int fin(int p,int q)
{
    if(v[0][q]>=p)
        return v[p][q];
    if(v[v[0][q]][q]==0) return 0;
    if(v[v[0][q]][q]==v[1][q])
    {
        p=(p-1)%v[1][q]+1;
        return fin(p,q);
    }
    p-=(v[0][q]-1);
    return fin(p,v[v[0][q]][q]);
}
int main()
{
    ifstream f("stramosi.in");
    ofstream g("stramosi.out");
    f>>n>>m;
    for(i=1; i<=n; i++)
    {
        f>>v[1][i];
        v[0][i]=1;
    }
    for(j=1; j<=n; j++)
    {
        for(i=1; i<=n; i++)
        w[0][i]=w[0][0];
        w[0][0]++;
        ok=1;
        i=1;
        do{
            i++;
            v[i][j]=v[1][v[i-1][j]];
            w[0][v[i][j]]++;
            if(w[0][v[i][j]]>w[0][0]||v[i][j]==v[1][j]) ok=0;
            else
            {
                w[1][v[i][j]]=i;
            }
            v[0][j]++;
        }while(v[i][j]&&ok);
        if(ok==0)
        {
            if(v[v[0][j]][j]!=v[1][j])
            {
                v[0][j]=w[1][v[v[0][j]][j]];
            }
        }
    }
    for(j=1; j<=m; j++)
    {
        f>>b>>a;
        g<<fin(a,b)<<'\n';
    }
    f.close(); g.close();
}