Pagini recente »
Borderou de evaluare (job #473695)
|
Clasament lasm_15_01_cl10_2
|
Borderou de evaluare (job #781623)
|
Clasament sim_info5
|
Cod sursă (job #310823)
Cod sursă (job
#310823)
#include <cstdio>
#include <cstring>
#define MAX_N 100000
#define MAX_NRS 50000
using namespace std;
FILE *f, *g;
char s[MAX_N + 2];
int crChar;
int len;
int rez;
int v[MAX_N + 1];
bool isDigit[300];
int exp(int a);
int term();
void getIsDigit()
{
int i;
for(i = '0'; i <= '9'; i ++)
isDigit[i] = 1;
}
void readFile()
{
f = fopen("bizar.in", "r");
fgets(s, MAX_N + 2, f);
len = strlen(s);
s[len - 1] = 0;///'\n'
len --;
fclose(f);
}
void spaces()
{
while(crChar < len && s[crChar] == ' ')
crChar ++;
}
int term()
{
spaces();
int nr = 0;
while(crChar < len && isDigit[s[crChar]])
{
nr = nr * 10 + s[crChar] - '0';
crChar ++;
}
spaces();
if(crChar < len && s[crChar] == '(')
{
return exp(nr);
}
return nr;
}
void getTerms(int &k, int v[])
{
k = 0;
while(crChar < len && s[crChar] != ')')
{
spaces();
if(s[crChar] == ',')
crChar ++;
if(isDigit[s[crChar]])
v[++ k] = term();
spaces();
}
}
int exp(int a)
{
int k = 0;
int v[MAX_NRS];
while(crChar < len && s[crChar] == '(')
{
spaces();
crChar ++;
getTerms(k, v);
a = a % k;
if(a == 0)
a = k;
crChar ++;
spaces();
a = v[a];
}
return a;
}
void solve()
{
getIsDigit();
rez = term();
}
void printFile()
{
g = fopen("bizar.out", "w");
fprintf(g, "%d\n", rez);
fclose(g);
}
int main()
{
readFile();
solve();
printFile();
return 0;
}