Cod sursa(job #1329200)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 29 ianuarie 2015 10:50:13
Problema Stramosi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <fstream>
#include <cstring>
#define nmax 250005
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
int n,m;
int t[nmax][20];
int masca;
char s[30];

int build(int i,int j)
{
    if (i<0||j<0) return 0;

    if (t[i][j]!=-1)
            return t[i][j];

    return build(t[i][j-1],j-1);

}
int query(int i,int j)
{


    while (masca>=1&&( (1<<masca) &j)==0) masca--;
    if (j==(1<<masca)) return t[i][masca];

    return query(t[i][masca],j-(1<<masca));
}

int main()
{
    int i,j,a,b,k,r;
    f>>n>>m;
    for (i=1;i<=n;i++)
            f>>t[i][0];
    f.get();
    for (i=1;i<=n;i++)
        for(j=1;(1<<j)<=n;j++)
                t[i][j]=-1;


    for (j=1;(1<<j)<=n;j++)
        for (i=1;i<=n;i++)

            t[i][j]=build(i,j); // build


    for (r=1;r<=m;r++) {
                memset(s,0,30);  // parsare
                f.getline(s,30);
                k=strlen(s);

                i=0;
                a=0;b=0;
                while (s[i]!=' ') a=a*10+s[i++]-'0';
                i++;
                while (s[i]!=NULL&&i<k) b=b*10+s[i++]-'0';


                masca=20;
                g<<query(a,b)<<'\n'; //query log
    }
    return 0;
}