Cod sursă (job #97336)

Utilizator avatar nita_teddy Teddy Nita nita_teddy IP ascuns
Problemă Bizar (clasele 9-10) Compilator cpp | 1,63 kb
Rundă Tema 10 clasele 9-10 2014/15 Status evaluat
Dată 11 dec. 2014 20:41:24 Scor 90
#include<cstdio>
#define MULT 100000
using namespace std;

int per[MULT+1];
int v[MULT+1];
int k;

char s[MULT+1];
int p;

void parc(int cat){
    int i=1,niv=1;

    while(i<cat){
        while(s[p]==' ') p++;
        if (s[p]=='('){
            niv++;
            k++;
        }
        else
        if (s[p]==')') niv--;
        else
        if (s[p]==',' &&niv==1) i++;
        p++;
    }
}

void parc_par(){
    int niv=1;

    while(niv>0){
        while(s[p]==' ') p++;
        if (s[p]=='('){
            niv++;
            k++;
        }
        else
        if (s[p]==')') niv--;
        p++;
    }
}

int numar(){
    int val=0;

    while(s[p]==' ') p++;

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

    return val;
}

int expresie(){
    int val=numar();

    while(s[p]==' ') p++;

    while(s[p]=='('){
        p++;
        while(s[p]==' ') p++;
        parc((val-1)%v[k]+1);
        k++;

        while(s[p]==' ') p++;

        val=expresie();

        while(s[p]==' ') p++;

        parc_par();
    }

    return val;
}

int main(){
    freopen ("bizar.in","r",stdin);
    freopen ("bizar.out","w",stdout);
    int i,top;

    gets(s);

    p=0;
    k=0;

    for(i=1;i<=MULT/3;i++) v[i]=0;

    i=0;
    top=1;
    while(s[p]!=NULL){
        if ('('==s[p]){
            i=top;
            top++;
            k++;
            v[i]=1;
            per[k]=i;
        }
        else
        if (s[p]==')'){
            k--;
            i=per[k];
        }
        else
        if (s[p]==',') v[i]++;
        p++;
    }

    p=0;
    k=1;

    printf ("%d",expresie());
    return 0;
}