Problem p00726 (C++) — buggy submission, verdict: Runtime Error

#include <algorithm>
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <string>
#include <vector>
//    #include <boost/multiprecision/cpp_int.hpp>
#include <functional>
#define int long long
#define inf 1000000007
#define pa pair<int, int>
#define ll long long
#define pal pair<double, pa>
#define ppa pair<pa, int>
#define ppap pair<int, pa>
#define ssa pair<string, int>
#define mp make_pair
#define pb push_back
#define EPS (1e-10)
#define equals(a, b) (fabs((a) - (b)) < EPS)

using namespace std;
// priority_queue<int, vector<int>, greater<int> > que;
class Point {
public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double a) { return Point(x * a, y * a); }
  Point operator/(double a) { return Point(x / a, y / a); }
  double absv() { return sqrt(norm()); }
  double norm() { return x * x + y * y; }
  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const Point &p) const {
    return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
  }
};
typedef Point Vector;

struct Segment {
  Point p1, p2;
};

double hen(Vector a) {
  if (fabs(a.x) < EPS && a.y > 0)
    return acos(0);
  else if (fabs(a.x) < EPS && a.y < 0)
    return 3 * acos(0);
  else if (fabs(a.y) < EPS && a.x < 0)
    return 2 * acos(0);
  else if (fabs(a.y) < EPS && a.x > 0)
    return 0.0;
  else if (a.y > 0)
    return acos(a.x / a.absv());
  else
    return 2 * acos(0) + acos(-a.x / a.absv());
}

string itos(int i) {
  ostringstream s;
  s << i;
  return s.str();
}

int gcd(int v, int b) {
  if (v > b)
    return gcd(b, v);
  if (v == b)
    return b;
  if (b % v == 0)
    return v;
  return gcd(v, b % v);
}
double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }

double distans(double x1, double y1, double x2, double y2) {
  double rr = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
  return sqrt(rr);
}
/*}
int pr[100010];
//int inv[100010];

int beki(int wa,int rr){
if(rr==0) return 1ll;
if(rr==1) return wa;
if(rr%2==1) return (beki(wa,rr-1)*wa)%inf;
int zx=beki(wa,rr/2);
return (zx*zx)%inf;
}

void gya(){
pr[0]=1;
for(int i=1;i<100010;i++){
pr[i]=(pr[i-1]*i)%inf;
}
for(int i=0;i<100010;i++) inv[i]=beki(pr[i],inf-2);

}

*/

//----------------kokomade tenpure------------

int a[200020] = {0};
string s, t, tt;
vector<int> G[100000];
int b[200020];
char c[200020];
int kosuu = 0;
int kazu[200020];
int nu(int i) {
  int r = 0;
  for (int j = i; j <= s.length(); j++) {
    if (s[j] <= '9' && s[j] >= '0') {
      r *= 10;
      r += s[j] - '0';
    } else
      break;
  }
  return r;
}

void dfs(int i, int j, int oya) {
  if (i > j)
    return;
  //	cout<<s.substr(i,j-i+1)<<endl;
  kosuu++;
  int r = kosuu;
  //	cout<<i<<" "<<j<<" "<<oya<<endl;
  //	cout<<oya<<" "<<r<<endl;
  if (s[i] >= 'A' && s[i] <= 'Z') {
    G[oya].pb(r);

    b[r] = 1;
    c[r] = s[i];
    //		cout<<"r="<<r<<endl;
    dfs(i + 1, j, oya);
  } else {
    G[oya].pb(r);
    b[r] = nu(i);
    if (s[a[i]] == '(') {
      dfs(a[a[i]] + 1, j, oya);
      dfs(a[i] + 1, a[a[i]] - 1, r);
    } else {
      dfs(a[i] + 1, j, oya);
      c[r] = s[a[i]];
      //		cout<<"r="<<r<<endl;
    }
  }
}

int kei(int u) {
  int r = 0;
  if (G[u].size() == 0) {
    kazu[u] = 1;
    return 1;
  }
  for (int j = 0; j < G[u].size(); j++) {
    r += b[G[u][j]] * kei(G[u][j]);
    r = min(r, 10000000ll);
  }
  kazu[u] = r;
  // cout<<"kosuu"<<u<<" "<<r<<endl;
  return r;
}
char ans;

void ch(int oya, int r) {
  //	cout<<oya<<" "<<kazu[oya]<<" "<<r<<endl;
  int u = 0;
  if (G[oya].size() == 0) {
    ans = c[oya];
    // cout<<c[oya]<<endl;
    return;
  }
  while (1) {

    if (kazu[G[oya][u]] * b[G[oya][u]] < r)
      r -= kazu[G[oya][u]] * b[G[oya][u]];
    else {
      r %= kazu[G[oya][u]];
      if (r == 0)
        r = kazu[G[oya][u]];
      ch(G[oya][u], r);
      break;
    }
    u++;
  }
}

signed main() {

  while (1) {
    // string s;
    int r;
    int na, nb;
    cin >> s >> r;
    if (s == "0" && r == 0)
      return 0;
    //	s="1("+s+")";
    for (int i = 0; i < 100000; i++) {
      G[i].clear();
      kazu[i] = 0;
    }
    int i;
    stack<int> st;
    for (int i = 0; i < s.length(); i++) {
      if (s[i] == '(') {
        st.push(i);
      }
      if (s[i] == ')') {
        int y = st.top();
        st.pop();
        a[y] = i;
      }
      if (s[i] >= '0' && s[i] <= '9') {
        int g = i + 1;
        while (s[g] >= '0' && s[g] <= '9')
          g++;
        a[i] = g;
      }
    }

    kosuu = 0;
    //	for(int i=0;i<s.length();i++) cout<<a[i]<<" ";
    //	cout<<endl;
    dfs(0, s.length() - 1, 0);
    //	cout<<	kei(0)<<endl;
    kei(0);
    if (kazu[0] <= r)
      cout << 0 << endl;
    else {
      ch(0, r + 1);
      cout << ans << endl;
    }
  }

  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <string>
#include <vector>
//    #include <boost/multiprecision/cpp_int.hpp>
#include <functional>
#define int long long
#define inf 1000000007
#define pa pair<int, int>
#define ll long long
#define pal pair<double, pa>
#define ppa pair<pa, int>
#define ppap pair<int, pa>
#define ssa pair<string, int>
#define mp make_pair
#define pb push_back
#define EPS (1e-10)
#define equals(a, b) (fabs((a) - (b)) < EPS)

using namespace std;
// priority_queue<int, vector<int>, greater<int> > que;
class Point {
public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double a) { return Point(x * a, y * a); }
  Point operator/(double a) { return Point(x / a, y / a); }
  double absv() { return sqrt(norm()); }
  double norm() { return x * x + y * y; }
  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const Point &p) const {
    return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
  }
};
typedef Point Vector;

struct Segment {
  Point p1, p2;
};

double hen(Vector a) {
  if (fabs(a.x) < EPS && a.y > 0)
    return acos(0);
  else if (fabs(a.x) < EPS && a.y < 0)
    return 3 * acos(0);
  else if (fabs(a.y) < EPS && a.x < 0)
    return 2 * acos(0);
  else if (fabs(a.y) < EPS && a.x > 0)
    return 0.0;
  else if (a.y > 0)
    return acos(a.x / a.absv());
  else
    return 2 * acos(0) + acos(-a.x / a.absv());
}

string itos(int i) {
  ostringstream s;
  s << i;
  return s.str();
}

int gcd(int v, int b) {
  if (v > b)
    return gcd(b, v);
  if (v == b)
    return b;
  if (b % v == 0)
    return v;
  return gcd(v, b % v);
}
double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }

double distans(double x1, double y1, double x2, double y2) {
  double rr = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
  return sqrt(rr);
}
/*}
int pr[100010];
//int inv[100010];

int beki(int wa,int rr){
if(rr==0) return 1ll;
if(rr==1) return wa;
if(rr%2==1) return (beki(wa,rr-1)*wa)%inf;
int zx=beki(wa,rr/2);
return (zx*zx)%inf;
}

void gya(){
pr[0]=1;
for(int i=1;i<100010;i++){
pr[i]=(pr[i-1]*i)%inf;
}
for(int i=0;i<100010;i++) inv[i]=beki(pr[i],inf-2);

}

*/

//----------------kokomade tenpure------------

int a[200020] = {0};
string s, t, tt;
vector<int> G[100000];
int b[200020];
char c[200020];
int kosuu = 0;
int kazu[200020];
int nu(int i) {
  int r = 0;
  for (int j = i; j <= s.length(); j++) {
    if (s[j] <= '9' && s[j] >= '0') {
      r *= 10;
      r += s[j] - '0';
    } else
      break;
  }
  return r;
}

void dfs(int i, int j, int oya) {
  if (i > j)
    return;
  kosuu++;
  int r = kosuu;
  //	cout<<i<<" "<<j<<" "<<oya<<endl;
  //	cout<<oya<<" "<<r<<endl;
  if (s[i] >= 'A' && s[i] <= 'Z') {
    G[oya].pb(r);

    b[r] = 1;
    c[r] = s[i];
    dfs(i + 1, j, oya);
  } else {
    G[oya].pb(r);
    b[r] = nu(i);
    if (s[a[i]] == '(') {
      dfs(a[a[i]] + 1, j, oya);
      dfs(a[i] + 1, a[a[i]] - 1, r);
    } else {
      dfs(a[i] + 1, j, oya);
      c[r] = s[a[i]];
    }
  }
}

int kei(int u) {
  int r = 0;
  if (G[u].size() == 0) {
    kazu[u] = 1;
    return 1;
  }
  for (int j = 0; j < G[u].size(); j++)
    r += b[G[u][j]] * kei(G[u][j]);
  kazu[u] = r;
  // cout<<"kosuu"<<u<<" "<<r<<endl;
  return r;
}
char ans;

void ch(int oya, int r) {
  int u = 0;
  if (kazu[oya] == 1) {
    ans = c[oya];
    return;
  }
  while (1) {

    if (kazu[G[oya][u]] * b[G[oya][u]] < r)
      r -= kazu[G[oya][u]] * b[G[oya][u]];
    else {
      r %= kazu[G[oya][u]];
      if (r == 0)
        r = kazu[G[oya][u]];
      ch(G[oya][u], r);
      return;
    }
    u++;
  }
}

signed main() {

  while (1) {
    // string s;
    int r;
    int na, nb;
    cin >> s >> r;
    if (s == "0" && r == 0)
      return 0;
    //	s="1("+s+")";
    for (int i = 0; i < 100000; i++) {
      G[i].clear();
      kazu[i] = 0;
    }
    int i;
    stack<int> st;
    for (int i = 0; i < s.length(); i++) {
      if (s[i] == '(') {
        st.push(i);
      }
      if (s[i] == ')') {
        int y = st.top();
        st.pop();
        a[y] = i;
      }
      if (s[i] >= '0' && s[i] <= '9') {
        int g = i + 1;
        while (s[g] >= '0' && s[g] <= '9')
          g++;
        a[i] = g;
      }
    }

    kosuu = 0;
    //	for(int i=0;i<s.length();i++) cout<<a[i]<<" ";
    //	cout<<endl;
    dfs(0, s.length() - 1, 0);
    //	cout<<	kei(0)<<endl;
    if (kei(0) <= r)
      cout << 0 << endl;
    else {
      ch(0, r + 1);
      cout << ans << endl;
    }
  }

  return 0;
}