Cod sursa(job #1329230)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 29 ianuarie 2015 11:23:34
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 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[2000000];
char o[20];

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;
    f>>n>>m;f.get();
    f.getline(s,2000000);
    i=1;
    for (j=0;s[j]!=NULL;++j){
            if (s[j]==' ') i++;
                    else t[i][0]=t[i][0]*10+s[j]-'0';
    } // parsare I

    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);

    for (m;m>=1;m--) {
                //parsare II
                f.getline(o,20);
                a=0;b=0;
                j=0;
                while (o[j]!=' ') a=a*10+o[j++]-'0';
                j++;
                while (o[j]!=0) b=b*10+o[j++]-'0';


                memset(o,0,sizeof(o));


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