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

#include <bits/stdc++.h>
#define ll long long int
#define ld long double
#define vii vector<ll>
#define pb push_back
#define fast                                                                   \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(NULL);                                                               \\
  cout.tie(NULL);
using namespace std;
const int MOD = 1e9 + 7, N = 1e5 + 3;

int main() {
  fast;
  ll n, m, k;
  cin >> n >> m >> k;
  ll a[n + 1], b[m + 1], prefix_sum[n + 1], prefix_sum1[m + 1];
  prefix_sum[0] = 0;
  prefix_sum1[0] = 0;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    prefix_sum[i] = prefix_sum[i - 1] + a[i];
  }
  for (int i = 1; i <= m; ++i) {
    cin >> b[i];
    prefix_sum1[i] = prefix_sum1[i - 1] + b[i];
  }
  ll mx = 0;
  for (int i = 0; i <= n; ++i) {
    ll diff = k - prefix_sum[i], ans = 0;
    if (diff < 0)
      break;
    ll low = 1, high = m;
    while (low <= high) {
      ll mid = (low + high) / 2;
      if (prefix_sum1[mid] <= diff) {
        ans = mid;
        low = mid + 1;
      } else
        high = mid - 1;
    }
    mx = max(mx, i + ans);
    // cout << i << ' ' << ans << ' ';
  }
  cout << mx;
  return 0;
}

Error: TLE

Fixed submission:

// g++ -std=c++17 -Wshadow -Wall -fsanitize=address -fsanitize=undefined
// -D_GLIBCXX_DEBUG -g PROGRAM -o OUTPUT -DLOCAL -lasan -lubsan
#include <bits/stdc++.h>
#include <ext/pb_ds/detail/standard_policies.hpp>

#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define alli(a, n, k) (a + k), (a + n + k)
#define FP(i, a, b, k) for (__typeof(a) i = a; i < b; i += k)
#define FS(i, a, b, k) for (__typeof(a) i = a; i > b; i -= k)
#define IT(it, a) for (__typeof(a.begin()) it = a.begin(); it != a.end(); ++it)
#define eps 1e-6
#define pi 3.141592653589793
using namespace std;
using namespace __gnu_pbds;

template <class T> inline T gcd(T x, T y) {
  if (!y)
    return x;
  return gcd(y, x % y);
}
typedef vector<int> VII;
typedef vector<ll> VLL;
typedef pair<int, int> PII;
typedef vector<pair<int, int>> VPII;
typedef vector<pair<int, PII>> VPPI;
const int MOD = 1e9 + 7;
const int INF = 1e9;

inline ll modulo(ll a, ll m) { return (a % m + m) % m; }

inline ll modInverse(ll a, ll m) {
  assert(__gcd(a, m) == 1);
  ll m0 = m;
  ll y = 0, x = 1;

  if (m == 1)
    return 0;

  while (a > 1) {
    ll q = a / m;
    ll t = m;

    m = a % m, a = t;
    t = y;

    y = x - q * y;
    x = t;
  }

  if (x < 0)
    x += m0;

  return x;
}

inline ll modPow(ll x, ll y, ll m) { // x^y % m
  if (y == 0)
    return 1LL;
  else if (y == 1)
    return x;
  else {
    ll ans = modPow(x, y / 2, m) % m;
    if (y & 1) {
      return (((ans * ans) % m) * x) % m;
    } else {
      return (ans * ans) % m;
    }
  }
}

vector<string> split(char d, string s) {
  stringstream ss(s);
  string t;
  vector<string> words;
  while (getline(ss, t, d)) {
    words.pb(t);
  }

  return words;
}
int solve(int i, int j, VLL &a, VLL &b, ll &k, ll t) {
  int ans1 = 0;
  if (i < a.size() && a[i] + t <= k)
    ans1 = 1 + solve(i + 1, j, a, b, k, t + a[i]);
  int ans2 = 0;
  if (j < b.size() && b[j] + t <= k)
    ans2 = 1 + solve(i, j + 1, a, b, k, t + b[j]);

  return max(ans1, ans2);
}
int main(int argc, char *argv[]) {
#ifdef LOCAL
  auto start = chrono::high_resolution_clock::now();
#endif

  ios::sync_with_stdio(false);
  cin.tie(NULL);

  int n, m;
  ll k;
  cin >> n >> m >> k;
  VLL a(n);
  VLL b(m);
  for (auto &x : a)
    cin >> x;

  for (auto &y : b)
    cin >> y;

  // int i = 0, j = 0;
  // ll t = 0,ans=0;
  // while(i<n && j<m)
  // {
  //     int c;
  //     if(a[i]>b[j])
  //         c = b[j++];
  //     else
  //         c = a[i++];

  //     if(t+c>k)
  //     {
  //         cout << ans;
  //         exit(0);
  //     }
  //     ans++;
  //     t += c;
  // }
  // while (i < n)
  // {
  //     if (t + a[i] > k)
  //     {
  //         cout << ans;
  //         exit(0);
  //     }
  //     ans++,i++;
  //     t += a[i];
  // }
  // while (j< m)
  // {
  //     if (t + b[j] > k)
  //     {
  //         cout << ans;
  //         exit(0);
  //     }
  //     ans++, j++;
  //     t += b[j];
  // }

  cout << solve(0, 0, a, b, k, 0);
  exit(0);
#ifdef LOCAL
  auto end = chrono::high_resolution_clock::now();
  double time_taken =
      chrono::duration_cast<chrono::nanoseconds>(end - start).count();

  time_taken *= 1e-9;

  cerr << "\\nTime taken by program is : " << fixed << time_taken
       << setprecision(9);
  cerr << " sec" << endl;
#endif
  return 0;
}