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

/*

   #
  # #    #    #   ####   #    #  #    #
 #   #   ##   #  #       #    #  #    #
#     #  # #  #   ####   ######  #    #
#######  #  # #       #  #    #  #    #
#     #  #   ##  #    #  #    #  #    #
#     #  #    #   ####   #    #   ####

*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define int long long int
#define hell 1000000007
#define F first
#define re 15000000
#define S second
#define pb push_back
#define all(a) (a).begin(), (a).end()
#define rep(i, a, b) for (int i = a; i < b; i++)
#define pi 3.1415926536
#define Mod 998244353
#define endl '\\n'
#define TIME                                                                   \\
  cerr << "\\nTime elapsed: " << setprecision(5)                                \\
       << 1000.0 * clock() / CLOCKS_PER_SEC << "ms\\n";
#define ordered_set                                                            \\
  tree<pair<int, int>, null_type, less<pair<int, int>>, rb_tree_tag,           \\
       tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_pbds;

int binarySearch(int x, int y, int z, int v[]) {
  int low = x;
  int high = y;
  int mid = x + (y - x) / 2;
  while (low <= high) {
    if (v[mid] == z)
      return mid;
    if (v[mid] < z)
      return binarySearch(mid + 1, high, z, v);
    if (v[mid] > z)
      return binarySearch(low, mid - 1, z, v);
  }
  return -1;
}
int modularExponentiation(int x, int y, int m) {
  if (y == 0)
    return 1;
  int p = modularExponentiation(x, y / 2, m) % m;
  p = (p * p) % m;

  return (y % 2 == 0) ? p : (x * p) % m;
}
int binaryExponentiation(int x, int n) {
  if (n == 0)
    return 1;
  else if (n % 2 == 0) // n is even
    return binaryExponentiation(x * x, n / 2);
  else // n is odd
    return x * binaryExponentiation(x * x, (n - 1) / 2);
}

set<string> s;
void genrate(string n, int len, int max) {
  cout << n << " ";
  if (len == max) {
    s.insert(n);
    return;
  }
  s.insert(n);
  genrate(n + '4', len + 1, max);
  genrate(n + '7', len + 1, max);
}
// bool visited[200005];
// vector<int> v[200005];
// bool recur[200005];
// int c = 0;
// void dfs(int x ,int parent)
// {
//    visited[x] = 1;
//    if(v[x].size() != 2)
//     c = -1;
//    for(int i = 0;i<v[x].size();i++){
//     if(v[x][i] == parent)
//       continue;
//     if(visited[v[x][i]] && v[x].size() == 2 && c ==  0)
//         c = 1;
//     else if(!visited[v[x][i]]){
//      dfs(v[x][i],x);
//    }
//    //return false;
//     }
// }
// memset(level,0,sizeof(level));
// char a2001][2001];
///**************** Cycle using DSU *********************///
/* int topological_sort(int x)
{
   vis[x] = 1;
   sort(all(v[x]));
   ans.pb(x);
   last[x] = x;
    for(int i =0;i<v[x].size();i++)
    {
        if(vis[v[x][i]]!=1){
            last[x] = topological_sort(v[x][i]);
        }
    }
    return last[x];
}
*/
int my_lower(vector<int> &v, int X) {
  int lo = 0, hi = v.size() - 1;
  if (v.size() == 0)
    return -1;
  while (hi - lo > 1) {
    int mi = (lo + hi) / 2;
    if (v[mi] < X) {
      lo = mi;
    } else
      hi = mi - 1;
  }
  int ans = -1;
  for (int i = lo; i <= hi; i++) {
    if (v[i] < X) {
      ans = i;
    }
  }
  if (ans != -1 && v[ans] < X) {
    return ans;
  } else
    return -1;
}
int my_upper(vector<int> &v, int X) {
  if (v.size() == 0)
    return -1;
  int lo = 0, hi = v.size() - 1;
  while (hi - lo > 1) {
    int mi = (lo + hi) / 2;
    if (v[mi] < X) {
      lo = mi + 1;
    } else
      hi = mi;
  }
  int ans = -1;
  for (int i = hi; i >= lo; i--) {
    if (v[i] > X) {
      ans = i;
    }
  }
  if (ans != -1 && v[ans] > X) {
    return ans;
  } else
    return -1;
}
void Print(int t, int c) { cout << "Case #" << t << ": " << c << endl; }
pair<int, int> dp[5001][5001];
vector<pair<int, int>> v[5001];
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  std::setprecision(20);
  int tests = 1;
  // freopen("input.txt", "r", stdin);
  //  cin>>tests;
  int tc = 0;
  while (tests--) {
    int n, k;
    cin >> n >> k;
    vector<int> p(n + 1), c(n + 1);
    for (int i = 1; i <= n; i++)
      cin >> p[i];
    for (int i = 1; i <= n; i++)
      cin >> c[i];
    for (int i = 1; i <= n; i++) {
      v[i].pb({p[i], c[p[i]]});
    }
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        dp[i][j] = {-1e18, 1e18};
      }
    }
    for (int i = 1; i <= n; i++) {
      stack<pair<int, int>> stk;
      stk.push({i, 0});
      int vis[n + 1];
      int len = 0;
      memset(vis, 0, sizeof(vis));
      while (!stk.empty()) {
        pair<int, int> x = stk.top();
        stk.pop();
        if (vis[x.F]) {
          dp[x.F][x.F] = {len, x.S};
          break;
        }
        vis[x.F] = 1;
        dp[i][x.F] = {len, x.S};
        len++;
        for (int j = 0; j < v[x.F].size(); j++) {
          stk.push({v[x.F][j].F, x.S + v[x.F][j].S});
        }
      }
    }
    int ans = -1e9;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        if (i != j && dp[i][j].F != -1e18) {
          int x = (k - dp[i][j].F);
          if (x >= 0) {
            x /= dp[i][i].F;
            ans = max(ans, max(dp[i][j].S, x * dp[i][i].S + dp[i][j].S));
          }
        } else if (i == j) {
          if (k >= dp[i][i].F) {
            ans = max(ans, max(dp[i][i].S, dp[i][i].S * (k / dp[i][i].F)));
          }
        }
      }
    }
    cout << ans;
  }
}

Error: WA

Fixed submission:

/*

   #
  # #    #    #   ####   #    #  #    #
 #   #   ##   #  #       #    #  #    #
#     #  # #  #   ####   ######  #    #
#######  #  # #       #  #    #  #    #
#     #  #   ##  #    #  #    #  #    #
#     #  #    #   ####   #    #   ####

*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define int long long int
#define hell 1000000007
#define F first
#define re 15000000
#define S second
#define pb push_back
#define all(a) (a).begin(), (a).end()
#define rep(i, a, b) for (int i = a; i < b; i++)
#define pi 3.1415926536
#define Mod 998244353
#define endl '\\n'
#define TIME                                                                   \\
  cerr << "\\nTime elapsed: " << setprecision(5)                                \\
       << 1000.0 * clock() / CLOCKS_PER_SEC << "ms\\n";
#define ordered_set                                                            \\
  tree<pair<int, int>, null_type, less<pair<int, int>>, rb_tree_tag,           \\
       tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_pbds;

int binarySearch(int x, int y, int z, int v[]) {
  int low = x;
  int high = y;
  int mid = x + (y - x) / 2;
  while (low <= high) {
    if (v[mid] == z)
      return mid;
    if (v[mid] < z)
      return binarySearch(mid + 1, high, z, v);
    if (v[mid] > z)
      return binarySearch(low, mid - 1, z, v);
  }
  return -1;
}
int modularExponentiation(int x, int y, int m) {
  if (y == 0)
    return 1;
  int p = modularExponentiation(x, y / 2, m) % m;
  p = (p * p) % m;

  return (y % 2 == 0) ? p : (x * p) % m;
}
int binaryExponentiation(int x, int n) {
  if (n == 0)
    return 1;
  else if (n % 2 == 0) // n is even
    return binaryExponentiation(x * x, n / 2);
  else // n is odd
    return x * binaryExponentiation(x * x, (n - 1) / 2);
}

set<string> s;
void genrate(string n, int len, int max) {
  cout << n << " ";
  if (len == max) {
    s.insert(n);
    return;
  }
  s.insert(n);
  genrate(n + '4', len + 1, max);
  genrate(n + '7', len + 1, max);
}
// bool visited[200005];
// vector<int> v[200005];
// bool recur[200005];
// int c = 0;
// void dfs(int x ,int parent)
// {
//    visited[x] = 1;
//    if(v[x].size() != 2)
//     c = -1;
//    for(int i = 0;i<v[x].size();i++){
//     if(v[x][i] == parent)
//       continue;
//     if(visited[v[x][i]] && v[x].size() == 2 && c ==  0)
//         c = 1;
//     else if(!visited[v[x][i]]){
//      dfs(v[x][i],x);
//    }
//    //return false;
//     }
// }
// memset(level,0,sizeof(level));
// char a2001][2001];
///**************** Cycle using DSU *********************///
/* int topological_sort(int x)
{
   vis[x] = 1;
   sort(all(v[x]));
   ans.pb(x);
   last[x] = x;
    for(int i =0;i<v[x].size();i++)
    {
        if(vis[v[x][i]]!=1){
            last[x] = topological_sort(v[x][i]);
        }
    }
    return last[x];
}
*/
int my_lower(vector<int> &v, int X) {
  int lo = 0, hi = v.size() - 1;
  if (v.size() == 0)
    return -1;
  while (hi - lo > 1) {
    int mi = (lo + hi) / 2;
    if (v[mi] < X) {
      lo = mi;
    } else
      hi = mi - 1;
  }
  int ans = -1;
  for (int i = lo; i <= hi; i++) {
    if (v[i] < X) {
      ans = i;
    }
  }
  if (ans != -1 && v[ans] < X) {
    return ans;
  } else
    return -1;
}
int my_upper(vector<int> &v, int X) {
  if (v.size() == 0)
    return -1;
  int lo = 0, hi = v.size() - 1;
  while (hi - lo > 1) {
    int mi = (lo + hi) / 2;
    if (v[mi] < X) {
      lo = mi + 1;
    } else
      hi = mi;
  }
  int ans = -1;
  for (int i = hi; i >= lo; i--) {
    if (v[i] > X) {
      ans = i;
    }
  }
  if (ans != -1 && v[ans] > X) {
    return ans;
  } else
    return -1;
}
void Print(int t, int c) { cout << "Case #" << t << ": " << c << endl; }
vector<int> get_digi(int n) {
  vector<int> v;
  while (n) {
    v.pb(n % 10);
    n /= 10;
  }
  reverse(all(v));
  return v;
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  std::setprecision(20);
  int tests = 1;
  // freopen("input.txt", "r", stdin);
  //  cin>>tests;
  int tc = 0;
  while (tests--) {
    int n, k;
    cin >> n >> k;
    vector<int> p(n + 1), c(n + 1);
    for (int i = 1; i <= n; i++)
      cin >> p[i];
    for (int i = 1; i <= n; i++)
      cin >> c[i];
    vector<pair<int, int>> v[5001];
    for (int i = 1; i <= n; i++) {
      v[i].pb({p[i], c[p[i]]});
    }
    pair<int, int> dp[n + 1][n + 1];
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        dp[i][j] = {-1e18, 1e18};
      }
    }
    for (int i = 1; i <= n; i++) {
      stack<pair<int, int>> stk;
      stk.push({i, 0});
      int vis[n + 1];
      int len = 0;
      memset(vis, 0, sizeof(vis));
      while (!stk.empty()) {
        pair<int, int> x = stk.top();
        stk.pop();
        if (vis[x.F]) {
          dp[x.F][x.F] = {len, x.S};
          break;
        }
        vis[x.F] = 1;
        dp[i][x.F] = {len, x.S};
        len++;
        for (int j = 0; j < v[x.F].size(); j++) {
          stk.push({v[x.F][j].F, x.S + v[x.F][j].S});
        }
      }
    }
    int ans = -1e9;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        if (i != j && dp[i][j].F != -1e18) {
          int x = (k - dp[i][j].F);
          if (x) {
            x /= dp[i][i].F;
            ans = max(ans, max(dp[i][j].S, x * dp[i][i].S + dp[i][j].S));
          }
        } else if (i == j) {
          if (k >= dp[i][j].F) {
            ans = max(ans, dp[i][i].S * (k / dp[i][j].F));
          }
        }
      }
    }
    cout << ans;
  }
}