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

#include "bits/stdc++.h"
#include <unordered_map>
#include <unordered_set>
#pragma warning(disable : 4996)
using namespace std;

long long int pow_int(int a, int b) {
  if (b) {
    return a * pow_int(a, b - 1);
  } else {
    return 1;
  }
}

pair<long long int, long long int> get(int type, string st, int aa = -1) {
  if (type == 0) {
    return make_pair(stoll(st), 1ll);
  } else if (type == 1) {
    if (st.empty())
      return make_pair(0, 1);
    return make_pair(stoll(st), pow_int(10, st.size()));
  } else {
    if (st.empty())
      return make_pair(0, 1);
    return make_pair(stoll(st), (pow_int(10, st.size()) - 1) * pow_int(10, aa));
  }
}
long long int gcd(long long int l, long long int r) {
  assert(l > 0 && r > 0);
  if (l > r)
    return gcd(r, l);
  else {
    const long long int num = r % l;
    if (num) {
      return gcd(l, num);
    } else {
      return l;
    }
  }
}
pair<long long int, long long int>
aplus(pair<long long int, long long int> &l,
      pair<long long int, long long int> &r) {
  auto p =
      make_pair(l.first * r.second + r.first * l.second, r.second * l.second);
  if (p.first == 0) {
    return make_pair(0, 1);
  }
  auto gc(gcd(p.first, p.second));
  p.first /= gc;
  p.second /= gc;
  return p;
}
int main() {
  string st;
  cin >> st;
  string stl, stc, str;
  if (st.find('(') == string::npos) {
    stl = st.substr(0, st.find('.'));
    stc = st.substr(1 + st.find('.'));
  } else {
    stl = st.substr(0, st.find('.'));
    stc = st.substr(1 + st.find('.'), st.find('(') - st.find('.') - 1);
    str = st.substr(1 + st.find('('), st.find(')') - st.find('(') - 1);
  }
  auto l = get(0, stl);
  auto c = get(1, stc);
  auto r = get(2, str, stc.size());
  auto p(aplus(l, c));
  auto q(aplus(p, r));

  cout << q.first << "/" << q.second << endl;

  return 0;
}

Error: -6
terminate called after throwing an instance of 'std::invalid_argument'
  what():  stoll


Fixed submission:

#include "bits/stdc++.h"
#include <unordered_map>
#include <unordered_set>
#pragma warning(disable : 4996)
using namespace std;

long long int pow_int(int a, int b) {
  if (b) {
    return a * pow_int(a, b - 1);
  } else {
    return 1;
  }
}

pair<long long int, long long int> get(int type, string st, int aa = -1) {
  if (type == 0) {
    return make_pair(stoll(st), 1ll);
  } else if (type == 1) {
    return make_pair(stoll(st), pow_int(10, st.size()));
  } else {
    if (st.empty())
      return make_pair(0, 1);
    return make_pair(stoll(st), (pow_int(10, st.size()) - 1) * pow_int(10, aa));
  }
}
long long int gcd(long long int l, long long int r) {
  assert(l > 0 && r > 0);
  if (l > r)
    return gcd(r, l);
  else {
    const long long int num = r % l;
    if (num) {
      return gcd(l, num);
    } else {
      return l;
    }
  }
}
pair<long long int, long long int>
aplus(pair<long long int, long long int> &l,
      pair<long long int, long long int> &r) {
  auto p =
      make_pair(l.first * r.second + r.first * l.second, r.second * l.second);
  auto gc(gcd(p.first, p.second));
  p.first /= gc;
  p.second /= gc;
  return p;
}
int main() {
  string st;
  cin >> st;
  string stl, stc, str;
  if (st.find('(') == string::npos) {
    stl = st.substr(0, st.find('.'));
    stc = st.substr(1 + st.find('.'));
  } else {
    stl = st.substr(0, st.find('.'));
    stc = st.substr(1 + st.find('.'), st.find('(') - st.find('.') - 1);
    str = st.substr(1 + st.find('('), st.find(')') - st.find('(') - 1);
  }
  auto l = get(0, stl);
  auto c = get(1, stc);
  auto r = get(2, str, stc.size());
  auto p(aplus(l, c));
  auto q(aplus(p, r));

  cout << q.first << "/" << q.second << endl;

  return 0;
}