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

#pragma GCC optimize("Ofast")

// インクルード
#include <algorithm>     //sort,二分探索,など
#include <bitset>        //固定長bit集合
#include <cmath>         //pow,logなど
#include <complex>       //複素数
#include <deque>         //両端アクセスのキュー
#include <functional>    //sortのgreater
#include <iomanip>       //setprecision(浮動小数点の出力の誤差)
#include <iostream>      //入出力
#include <map>           //map(辞書)
#include <numeric>       //iota(整数列の生成),gcdとlcm(c++17)
#include <queue>         //キュー
#include <set>           //集合
#include <stack>         //スタック
#include <string>        //文字列
#include <unordered_map> //イテレータあるけど順序保持しないmap
#include <unordered_set> //イテレータあるけど順序保持しないset
#include <utility>       //pair
#include <vector>        //可変長配列

using namespace std;
using Graph = vector<vector<int>>; // グラフ型
typedef long long ll;

// マクロ
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = (ll)(n)-1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = (a); i <= (b); i++)
#define FORD(i, a, b) for (ll i = (a); i >= (b); i--)
#define ALL(x) (x).begin(), (x).end() // sortなどの引数を省略したい
#define SIZE(x) ((ll)(x).size())      // sizeをsize_tからllに直しておく
#define MAX(x) *max_element(ALL(x))
#define INF 1000000000000 // 10^12
#define MOD 10000007      // 10^9+7
#define PB push_back
#define MP make_pair
#define F first
#define S second
#define MAXR 100000 // 10^5:最大のrange(素数列挙などで使用)

int main() {
  // 高速化
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);

  int k;
  cin >> k;
  vector<ll> a;

  FOR(i, 1, 9) { a.push_back(i); }

  while (1) {
    if (k <= a.size()) {
      cout << a[k - 1] << "\\n";
      return 0;
    }
    k -= a.size();
    vector<ll> old;

    swap(a, old);
    for (ll x : old) {
      FOR(i, -1, 1) {
        int num = x % 10 + i;
        if (num < 0 || num > 9) {
          continue;
        }
        a.push_back(x * 10 + num);
      }
    }
  }

  return 0;
}


Error: 0

Fixed submission:

#pragma GCC optimize("Ofast")

// インクルード
#include <algorithm>     //sort,二分探索,など
#include <bitset>        //固定長bit集合
#include <cmath>         //pow,logなど
#include <complex>       //複素数
#include <deque>         //両端アクセスのキュー
#include <functional>    //sortのgreater
#include <iomanip>       //setprecision(浮動小数点の出力の誤差)
#include <iostream>      //入出力
#include <map>           //map(辞書)
#include <numeric>       //iota(整数列の生成),gcdとlcm(c++17)
#include <queue>         //キュー
#include <set>           //集合
#include <stack>         //スタック
#include <string>        //文字列
#include <unordered_map> //イテレータあるけど順序保持しないmap
#include <unordered_set> //イテレータあるけど順序保持しないset
#include <utility>       //pair
#include <vector>        //可変長配列

using namespace std;
typedef long long ll;

// マクロ
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = (ll)(n)-1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = (a); i <= (b); i++)
#define FORD(i, a, b) for (ll i = (a); i >= (b); i--)
#define ALL(x) (x).begin(), (x).end() // sortなどの引数を省略したい
#define SIZE(x) ((ll)(x).size())      // sizeをsize_tからllに直しておく
#define MAX(x) *max_element(ALL(x))
#define INF 1000000000000 // 10^12
#define MOD 10000007      // 10^9+7
#define PB push_back
#define MP make_pair
#define F first
#define S second
#define MAXR 100000 // 10^5:最大のrange(素数列挙などで使用)

// void runrun(ll num, ll count, list<ll> ls){
//   if(digit == 1){

//   }
// }

//   int A[100];
//     while(num!=0){
//         A[digit] = num % 10;
//         num /= 10;
//         digit++;
//     }

//   bool ans = true;
//   REP(i, digit-1){
//     if(abs(A[i+1]-A[i])<=1){
//       continue;
//     }else{
//       ans = false;
//     }
//   }
//   return ans;
// }

int main() {
  // 高速化
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);

  int K;
  cin >> K;
  ll ls[100000];

  FOR(i, 1, 9) { ls[i - 1] = i; }

  int begin = 0;
  int end = 8;
  int last = 9;

  while (last < K - 1) {
    FOR(j, begin, end) {
      ll iti_no_kurai = ls[j] % 10;

      if (iti_no_kurai != 0) {
        ls[last] = ls[j] * 10 + iti_no_kurai - 1;
        last++;
      }

      ls[last] = ls[j] * 10 + iti_no_kurai;
      last++;

      if (iti_no_kurai != 9) {
        ls[last] = ls[j] * 10 + iti_no_kurai + 1;
        last++;
      }
    }
    begin = end + 1;
    end = last;
    last = end + 1;
  }

  cout << ls[K - 1] << "\\n";

  return 0;
}