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

#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_map>
#include <utility>
#include <vector>

#define INF 1000000000
#define LINF 9000000000000000000
#define mod 1000000007

#define rep(i, n) for (int i = 0; i < int(n); i++)
#define rrep(i, n) for (int i = n - 1; i >= 0; i--)
#define REP(i, a, b) for (int i = (a); i < int(b); i++)
#define all(x) (x).begin(), x.end()
#define pb push_back
#define mp make_pair

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<long long> vll;
typedef pair<int, int> pi;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int ddx[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int ddy[8] = {0, 1, 1, 1, 0, -1, -1, -1};
bool debug = false;

/*---------------------------------------------------*/

#define int long long

const int MAX = LLONG_MAX / 10;
/* 現在地 コスト 残り時間 */
typedef tuple<int, int, int> tp;

/* first: 移動先   second: 移動コスト */
typedef pair<int, int> P;

vector<P> G[110];

void solve(int n, int m, int l, int k, int a, int h) {
  /* 最短経路を格納する dist[町][残りの時間] */
  int dist[110][110];
  for (int i = 0; i < 110; i++) {
    for (int j = 0; j < 110; j++) {
      dist[i][j] = MAX;
    }
  }

  /* 冷凍施設のある都市かどうか */
  vector<bool> freeze(110, false);
  for (int i = 0; i < l; i++) {
    int town;
    cin >> town;
    freeze[town] = true;
  }

  /* 経路情報の初期化 */
  for (int i = 0; i < 110; i++) {
    G[i].clear();
  }
  /* 経路情報を格納 */
  for (int i = 0; i < k; i++) {
    int x, y, t;
    cin >> x >> y >> t;
    G[x].push_back(mp(y, t));
    G[y].push_back(mp(x, t));
  }

  /* 拡張ダイクストラパート */
  priority_queue<tp, vector<tp>, greater<tp>> que;
  que.push(make_tuple(a, 0, m));
  while (que.size()) {
    /* 現在地 コスト 残り時間 */
    int now, cost, time;
    tie(now, cost, time) = que.top();
    que.pop();
    if (dist[now][time] < cost)
      continue; /* すでにコストがも止まっていた時 */

    for (auto x : G[now]) {
      if (freeze[now]) { /* 休憩所があったら休憩したいね */
        for (int i = 0; i <= m; i++) {
          if (m < time + i)
            break; /* これ以上休憩しても時間の無駄無駄無駄ァ!!! */
          if (time + i - x.second < 0)
            continue; /* 移動中に溶けてしまうので */

          /* 最短経路を計算する */
          if (cost + i + x.second < dist[x.first][time + i - x.second]) {
            dist[x.first][time + i - x.second] = cost + i + x.second;
            que.push(make_tuple(x.first, dist[x.first][time + i - x.second],
                                time + i - x.second));
          }
        }
      } else { /* 休憩所がないので進むしかないね */
        /* 氷が溶けちゃうね */
        if (time - x.second < 0)
          continue;
        /* 最短経路を計算する  */
        if (cost + x.second < dist[x.first][time - x.second]) {
          dist[x.first][time - x.second] = cost + x.second;
          que.push(make_tuple(x.first, dist[x.first][time - x.second],
                              time - x.second));
        }
      }
    }
  }

  int maxi = MAX;
  for (int i = 0; i < 110; i++) {
    maxi = min(maxi, dist[h][i]);
  }
  if (maxi == MAX)
    cout << "Help!" << endl;
  else
    cout << maxi << endl;
}

signed main() {
  int n, m, l, k, a, h;
  while (cin >> n >> m >> l >> k >> a >> h, n | m | l | k | a | h) {
    solve(n, m, l, k, a, h);
  }
}


Error: WA

Fixed submission:

#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#define INF 10000000
using namespace std;
bool debug = false;

double calc(int r, int t, int y) {
  double x;
  if (r == 1) {
    x = 1 + double(y) * t / 100;
  } else if (r == 2) {
    x = pow(1 + double(y) / 100, y);
  }
  // cout<<"calc:"<<x<<endl;
  return x;
}

int main() {
  int n, y;
  int b, r, t;
  while (1) {
    pair<double, int> p[51];
    cin >> n;
    if (n == 0)
      break;
    cin >> y;
    for (int i = 0; i < n; i++) {
      cin >> b >> r >> t;
      p[i].first = calc(r, t, y);
      p[i].second = b;
    }
    sort(p, p + n);
    reverse(p, p + n);
    cout << p[0].second << endl;
  }

  return 0;
}