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

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef unsigned int ui;
typedef unsigned long long ull;

#define Rep(i, n) for (int i = 0; i < (n); ++i)
#define Repd(i, n) for (int i = (n)-1; i >= 0; --i)
#define For(i, a, b) for (int i = (a); i <= (b); ++i)
#define Ford(i, a, b) for (int i = (a); i >= (b); --i)
#define Fit(i, v)                                                              \\
  For(__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++i)
#define Fitd(i, v)                                                             \\
  For(__typeof((v).rbegin()) i = (v).rbegin(); i != (v).rend(); ++i)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define sz(a) ((int)(a).size())
#define all(a) (a).begin(), (a).end()
#define ms(a, x) memset(a, x, sizeof(a))

template <class F, class T> T convert(F a, int p = -1) {
  stringstream ss;
  if (p >= 0)
    ss << fixed << setprecision(p);
  ss << a;
  T r;
  ss >> r;
  return r;
}
template <class T> T gcd(T a, T b) {
  T r;
  while (b != 0) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
template <class T> T lcm(T a, T b) { return a / gcd(a, b) * b; }
template <class T> T sqr(T x) { return x * x; }
template <class T> T cube(T x) { return x * x * x; }
template <class T> int getbit(T s, int i) { return (s >> i) & 1; }
template <class T> T onbit(T s, int i) { return s | (T(1) << i); }
template <class T> T offbit(T s, int i) { return s & (~(T(1) << i)); }
template <class T> int cntbit(T s) { return __builtin_popcount(s); }
const int bfsz = 1 << 16;
char bf[bfsz + 5];
int rsz = 0;
int ptr = 0;
char gc() {
  if (rsz <= 0) {
    ptr = 0;
    rsz = (int)fread(bf, 1, bfsz, stdin);
    if (rsz <= 0)
      return EOF;
  }
  --rsz;
  return bf[ptr++];
}
void ga(char &c) {
  c = EOF;
  while (!isalpha(c))
    c = gc();
}
int gs(char s[]) {
  int l = 0;
  char c = gc();
  while (isspace(c))
    c = gc();
  while (c != EOF && !isspace(c)) {
    s[l++] = c;
    c = gc();
  }
  s[l] = '\\0';
  return l;
}
template <class T> bool gi(T &v) {
  v = 0;
  char c = gc();
  while (c != EOF && c != '-' && !isdigit(c))
    c = gc();
  if (c == EOF)
    return false;
  bool neg = c == '-';
  if (neg)
    c = gc();
  while (isdigit(c)) {
    v = v * 10 + c - '0';
    c = gc();
  }
  if (neg)
    v = -v;
  return true;
}

typedef pair<int, int> II;

const ld PI = acos(ld(-1.0));
const ld eps = 1e-9;

const int inf = (int)1e9 + 5;
const ll linf = (ll)1e17 + 5;
int dr[4] = {-1, 0, +1, 0};
int dc[4] = {0, -1, 0, +1};
const ll mod = 1000000007;

#define maxn 100005

ll n, k;

string toString(ll x) {
  string t = "";
  while (x) {
    t.pb((x % 10) + '0');
    x /= 10;
  }
  reverse(all(t));
  return t;
}

ll cal(ll x) {
  ll run = 1, RR = 1, R = 9, res = 0;
  while (x >= RR * 10) {
    res += R * run;
    RR *= 10;
    R *= 10;
    run++;
  }
  res += (x - RR + 1) * run;
  return res;
}

void solve() {
  ll l = 1, r = 1000000000, mid;
  while (l < r) {
    mid = (l + r) >> 1;
    if (cal(mid) >= n) {
      r = mid;
    } else
      l = mid + 1;
  }
  //	cout << l << " " << r << endl;
  string res = "";
  For(i, l, l + 100) res += toString(i);
  //	cout << res << endl;

  ll x = cal(l - 1);
  //	cout << n << " " << x << " " << k << endl;
  cout << res.substr(n - x - 1, k) << endl;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  //    freopen("in.txt", "r", stdin);

  while (cin >> n >> k) {
    if (n == 0 && k == 0) {
      break;
    }
    solve();
  }

  return 0;
}

Error: 0

Fixed submission:

#include <iostream>
using namespace std;
int a[10] = {9}, d[10];
int main() {
  int n, k, i, j, t, m;
  for (i = 1; i < 10; i++)
    a[i] = 10 * a[i - 1];
  while (cin >> n >> k && n) {
    i = 0;
    t = 1;
    m = 1;
    while (n - a[i] * (i + 1) >= 0) {
      n -= a[i] * (i + 1);
      i++;
    }
    for (j = 0; j < i; j++)
      t *= 10;
    while (n - (i + 1) > 0) {
      n -= i + 1;
      t++;
    }
    for (j = 0; j < n; j++)
      m *= 10;
    cout << t % m;
    k -= n;
    m = 1;
    while (1) {
      t++;
      if (k - (i + 1) > 0) {
        cout << t;
        k -= i + 1;
      } else {
        if (k < i + 1)
          while (k--)
            m *= 10;
        cout << t / m << endl;
        break;
      }
      if (t == 9 || t == 99 | t == 999 | t == 9999 | t == 99999 | t == 999999 |
                        t == 9999999 | t == 99999999 | t == 999999999)
        i++;
    }
  }
  return 0;
}