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

#include <bits/stdc++.h>

using namespace std;
#define all(x) x.begin(), x.end()

const int N = 200000 + 10;
const int MOD = 1000000000 + 7;

vector<long long> a, b, c;

int main() {
  int n, k;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    long long x;
    cin >> x;
    if (x > 0)
      a.push_back(x);
    else if (x < 0)
      b.push_back(x);
    else
      c.push_back(x);
  }
  sort(all(a), [&](long long a, long long b) { return a > b; });
  sort(all(b));
  sort(all(c));

  if (k == n) {
    long long ans = 1;
    for (auto x : a)
      ans = ans * x % MOD;
    for (auto x : b)
      ans = ans * x % MOD;
    for (auto x : c)
      ans = ans * x % MOD;
    ans = (ans + MOD) % MOD;
    cout << ans;
  } else {
    if (a.size() + b.size() < k) {
      cout << 0;
    } else {
      if (a.empty()) {
        long long ans = 1;
        if (k & 1) {
          if (c.empty()) {
            for (int i = 1; i <= k; i++)
              ans = ans * b[b.size() - i] % MOD;
          } else {
            cout << 0;
            return 0;
          }
        } else
          for (int i = 0; i < k; i++)
            ans = ans * b[i] % MOD;
        ans = (ans + MOD) % MOD;
        cout << ans;
      } else {
        if (b.size() & 1)
          b.pop_back();
        long long ans = 1, p = 0, q = 0;
        if (k & 1)
          ans = a[p++], k--;
        while (k) {
          if (q + 2 > b.size() || (a[p] * a[p + 1] > b[q] * b[q + 1])) {
            ans = ans * (a[p] * a[p + 1] % MOD) % MOD;
            p += 2;
          } else {
            ans = ans * (b[q] * b[q + 1] % MOD) % MOD;
            q += 2;
          }
          k -= 2;
        }
        cout << ans;
      }
    }
  }

#ifndef ONLINE_JUDGE
  system("pause");
#endif
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>

using namespace std;
#define all(x) x.begin(), x.end()

const int N = 200000 + 10;
const int MOD = 1000000000 + 7;

vector<long long> a, b, c;

int main() {
  int n, k;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    long long x;
    cin >> x;
    if (x > 0)
      a.push_back(x);
    else if (x < 0)
      b.push_back(x);
    else
      c.push_back(x);
  }
  sort(all(a), [&](long long a, long long b) { return a > b; });
  sort(all(b));
  sort(all(c));

  if (k == n) {
    long long ans = 1;
    for (auto x : a)
      ans = ans * x % MOD;
    for (auto x : b)
      ans = ans * x % MOD;
    for (auto x : c)
      ans = ans * x % MOD;
    ans = (ans + MOD) % MOD;
    cout << ans;
  } else {
    if (b.size() & 1)
      b.pop_back();
    if (a.size() + b.size() < k) {
      cout << 0;
    } else {
      if (a.empty()) {
        while (true)
          ;
        long long ans = 1;
        if (k & 1)
          for (int i = 1; i <= k; i++)
            ans = ans * b[b.size() - i] % MOD;
        else
          for (int i = 0; i < k; i++)
            ans = ans * b[i] % MOD;
        ans = (ans + MOD) % MOD;
        cout << ans;
      } else {
        long long ans = 1, p = 0, q = 0;
        if (k & 1)
          ans = a[p++], k--;
        while (k) {
          if (q + 2 > b.size() || (a[p] * a[p + 1] >= b[q] * b[q + 1])) {
            ans = ans * (a[p] * a[p + 1] % MOD) % MOD;
            p += 2;
          } else {
            ans = ans * (b[q] * b[q + 1] % MOD) % MOD;
            q += 2;
          }
          k -= 2;
        }
        cout << ans;
      }
    }
  }

#ifndef ONLINE_JUDGE
  system("pause");
#endif
  return 0;
}