Cod sursă (job #344387)

Utilizator avatar PredaBoss Preda Andrei PredaBoss IP ascuns
Problemă Bizar (clasele 9-10) Compilator cpp | 1,70 kb
Rundă Arhiva de probleme Status evaluat
Dată 26 ian. 2018 20:55:10 Scor 90
#include <bits/stdc++.h>

using namespace std;
ifstream fin("bizar.in");
ofstream fout("bizar.out");
struct stive
{
    int nr,semn,par;
};
stive s[100000];
int p,i,j,k,t,v[40000],ap[40000],sf[40000],b,c;
char a[100000];
int rez()
{
    v[b]=s[i].nr;
    if(i+2==sf[-1*v[b]]){
        k=s[i+1].nr;
        i+=3;
    }
    else{
            t=k%s[-1*s[i].nr].semn;
            if(t==0)
                t=s[-1*s[i].nr].semn;
                int ind=0;
            while(ind!=t){
                    i++;
                if(s[i].nr>=0 && s[i].par==-1*v[b])
                ind++;
            }
            k=s[i].nr;
            if(s[i+1].nr<0 && s[i+1].nr!=v[b]){
                b++;
    i++;
                k=rez();}
        i=sf[-1*v[b]]+1;}
        if(b>0)
    b--;
    return k;

}
int termen()
{
    int n=0;
    while(a[i]-'0'>=0 && a[i]-'0'<=9){
        n=n*10+(a[i]-'0');
        i++;
    }
    return n;
}
void calcul()
{
    while(a[i]!=')' && a[i]!='\0'){
        if(a[i]-'0'>0 && a[i]-'0'<=9){
            s[p].nr=termen();
            s[p].par=k;
            p++;
            s[k].semn++;
        }
        else{
            if(a[i]=='('){
               c++;
               k=c;
                i++;
                s[p].nr=-1*k;
                ap[k]++;
                p++;
                calcul();}
            else
                i++;
        }
    }
    if(a[i]==')')
    sf[k]=p;
    s[p].nr=-1*k;
    ap[k]++;
    p++;
    while(ap[k]==2)
        k--;
    i++;
}
int main()
{fin.get(a,100000);
i=0;
p=0;
k=0;
c=0;
while(a[i]!='\0')
calcul();
p--;
k=s[0].nr;
i=1;
b=0;
while(i<p)
    j=rez();
fout<<j;
    return 0;
}