Problem p02585 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ld long double
#define ll long long
#define P pair<int, int>
#define fi first
#define se second
#define rep(i, n) for (int i = 0; i < n; i++)
#define all(v) v.begin(), v.end()
#define pb push_back
#define eb emplace_back
template <class T> void chmax(T &a, T b) {
  if (a < b)
    a = b;
}
template <class T> void chmin(T &a, T b) {
  if (a > b)
    a = b;
}
constexpr int INF = 1000000000000000000;
constexpr int mod = 1000000007;
constexpr double eps = 1e-8;
const double pi = acos(-1);
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
int Random(int mi, int ma) {
  random_device rnd;
  mt19937 mt(rnd()); // 32bit
  //[mi,ma]
  uniform_int_distribution<int> engine(mi, ma);
  return engine(mt);
}
int gcd(int a, int b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
int lcm(int a, int b) { return a / gcd(a, b) * b; }
bool prime(int a) {
  if (a == 1)
    return false;
  for (int i = 2; i * i <= a; i++) {
    if (a % i == 0)
      return false;
  }
  return true;
}
int modpow(int a, int b) {
  if (b == 0)
    return 1;
  if (b % 2)
    return modpow(a, b - 1) * a % mod;
  int memo = modpow(a, b / 2);
  return memo * memo % mod;
}
vector<int> kaijo, invkaijo;
void init_fact(int n) {
  kaijo.resize(n + 1);
  invkaijo.resize(n + 1);
  kaijo[0] = 1;
  for (int i = 1; i <= n; i++) {
    kaijo[i] = kaijo[i - 1] * i;
    kaijo[i] %= mod;
  }
  rep(i, n + 1) invkaijo[i] = modpow(kaijo[i], mod - 2);
}
int comb(int a, int b) {
  if (a < b)
    return 0;
  if (a < 0 || b < 0)
    return 0;
  return kaijo[a] * invkaijo[a - b] % mod * invkaijo[b] % mod;
}
int inv(int x) {
  x = modpow(x, mod - 2);
  return x;
}
int used[5010];
signed main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n, k, p[5010], c[5010], ans = -INF;
  cin >> n >> k;
  rep(i, n) {
    cin >> p[i];
    p[i]--;
  }
  rep(i, n) cin >> c[i];
  rep(i, n) {
    int pos = i;
    int cur = 0;
    if (k <= n) {
      rep(_, k) {
        pos = p[pos];
        cur += c[pos];
        chmax(ans, cur);
      }
    } else {
      fill(used, used + n, -1);
      used[pos] = 0;
      vector<int> v = {0};
      int memo = -1;
      rep(hoge, 10000) {
        pos = p[pos];
        cur += c[pos];
        v.pb(cur);
        if (used[pos] != -1) {
          memo = used[pos];
          used[pos] = hoge;
          break;
        }
        used[pos] = hoge;
      }
      int copyk = k;
      int fir = 0;
      if (memo) {
        fir = v[memo];
        chmax(ans, *max_element(v.begin(), v.begin() + memo));
        rep(_, memo) v.erase(v.begin());
        k -= memo;
        for (int &j : v)
          j -= fir;
      }
      int ma = *max_element(v.begin() + 1, v.end());
      if (memo)
        chmax(ans, fir + max(0ll, ma));
      else
        chmax(ans, ma);
      if (v.back() > 0) {
        int t = k / (v.size() - 1);
        chmax(ans, fir + v.back() * t +
                       (*max_element(v.begin(),
                                     v.begin() + k % (v.size() - 1) + 1)));
        t--;
        if (t)
          chmax(ans, fir + v.back() * t + max(0ll, ma));
      }
      k = copyk;
    }
  }
  cout << ans << endl;
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ld long double
#define ll long long
#define P pair<int, int>
#define fi first
#define se second
#define rep(i, n) for (int i = 0; i < n; i++)
#define all(v) v.begin(), v.end()
#define pb push_back
#define eb emplace_back
template <class T> void chmax(T &a, T b) {
  if (a < b)
    a = b;
}
template <class T> void chmin(T &a, T b) {
  if (a > b)
    a = b;
}
constexpr int INF = 1000000000000000000;
constexpr int mod = 1000000007;
constexpr double eps = 1e-8;
const double pi = acos(-1);
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
int Random(int mi, int ma) {
  random_device rnd;
  mt19937 mt(rnd()); // 32bit
  //[mi,ma]
  uniform_int_distribution<int> engine(mi, ma);
  return engine(mt);
}
int gcd(int a, int b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
int lcm(int a, int b) { return a / gcd(a, b) * b; }
bool prime(int a) {
  if (a == 1)
    return false;
  for (int i = 2; i * i <= a; i++) {
    if (a % i == 0)
      return false;
  }
  return true;
}
int modpow(int a, int b) {
  if (b == 0)
    return 1;
  if (b % 2)
    return modpow(a, b - 1) * a % mod;
  int memo = modpow(a, b / 2);
  return memo * memo % mod;
}
vector<int> kaijo, invkaijo;
void init_fact(int n) {
  kaijo.resize(n + 1);
  invkaijo.resize(n + 1);
  kaijo[0] = 1;
  for (int i = 1; i <= n; i++) {
    kaijo[i] = kaijo[i - 1] * i;
    kaijo[i] %= mod;
  }
  rep(i, n + 1) invkaijo[i] = modpow(kaijo[i], mod - 2);
}
int comb(int a, int b) {
  if (a < b)
    return 0;
  if (a < 0 || b < 0)
    return 0;
  return kaijo[a] * invkaijo[a - b] % mod * invkaijo[b] % mod;
}
int inv(int x) {
  x = modpow(x, mod - 2);
  return x;
}
signed main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n, k, p[5010], c[5010], ans = -INF;
  cin >> n >> k;
  rep(i, n) {
    cin >> p[i];
    p[i]--;
  }
  rep(i, n) cin >> c[i];
  rep(i, n) {
    int pos = i;
    int cur = 0;
    rep(_, k) {
      pos = p[pos];
      cur += c[pos];
      chmax(ans, cur);
    }
  }
  cout << ans << endl;
  return 0;
}