Cod sursă (job #98813)

Utilizator avatar Master011 Martac Dragos Master011 IP ascuns
Problemă Bizar (clasele 9-10) Compilator cpp | 1,34 kb
Rundă Tema 10 clasele 9-10 2014/15 Status evaluat
Dată 17 dec. 2014 03:21:15 Scor 60
#include<cstdio>
using namespace std;

FILE *in = fopen("bizar.in","r");
FILE *out = fopen("bizar.out","w");

const int Nmax = 100005;
char S[Nmax];
int nre,p,v[Nmax];

int get_val();
int central(int , int);
int get_numbers(int );

int main (){
    char c=fgetc(in);
    while(c!='\n'){
        if(c!=' ')
            S[nre++]=c;
        c=fgetc(in);
    }
    fprintf(out,"%d",central(0,get_val()));
    return 0;
}

int get_val(){
    int val = 0;
    while(S[p]>='0' && S[p]<='9'){
        val=val*10+S[p]-'0';
        p++;
    }
    return val;
}

int get_numbers(int poz){
    int pozf=poz, X;
    while(S[p]!=')'){
        X=get_val();
        if(S[p]==','){
            v[pozf++]=X;
            p++;
        }else if(S[p]==')'){
            v[pozf++]=X;
        }
        else v[pozf++]=central(pozf,X);

    }
    p++;
    return pozf;
}

int central(int poz, int X){
    int pozf;
    while(S[p]!=')' && p<nre){
        if(S[p]=='('){
            p++;
            pozf = get_numbers(poz);
        }
        if(pozf!=poz){
            int l = pozf - poz;
            if(l<X){
                int rr = X % l;
                if(!rr) rr = l - 1;
                else rr--;
                X = v[rr+poz];
            }else X = v[poz+X-1];
            pozf=poz;
        }
    }
    return X;
}