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

#include <algorithm>
#include <chrono>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <limits.h>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <unordered_map>

#define fast                                                                   \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(0);                                                                  \\
  cout.tie(0);

#define ll long long
#define ld long double

#define pb push_back
#define ins insert
#define er erase

#define f(i, a, b) for (int i = a; i < b; ++i)
#define rf(i, a, b) for (int i = a; i >= b; --i)
#define cmax(a, b) a = max(a, b)
#define cmin(a, b) a = min(a, b)
#define cadd(a, b) a = add(a, b)
#define csub(a, b) a = subt(a, b)
#define cmul(a, b) a = mult(a, b)
#define mem(a, b) memset(a, b, sizeof(a))

#define vi vector<int>
#define vst vector<string>
#define vpii vector<pii>
#define sz(a) (int)(a).size()

#define all(v) v.begin(), v.end()
#define lb lower_bound
#define ub upper_bound
#define mxe max_element
#define mne min_element

#define srt(v) sort(all(v))
#define rsrt(v) sort(v.rbegin(), v.rend())

#define pii pair<int, int>
#define ff first
#define ss second

#define bs bitset
#define bpc(a) __builtin_popcount(a)
#define prec(a) fixed << setprecision(a)

#define mii map<int, int>
#define umii unordered_map<int, int>

#define si set<int>
#define usi unordered_set<int>
#define spii set<pii>

#define dbg(a, st, end)                                                        \\
  f(i, st, end + 1) cerr << a[i] << sp;                                        \\
  cerr << nl;
#define pnt(a, st, end)                                                        \\
  f(i, st, end + 1) cout << a[i] << sp;                                        \\
  cout << nl;
#define dbgc(a)                                                                \\
  for (auto y : a)                                                             \\
    cerr << y << sp;                                                           \\
  cerr << nl;
#define dbgm(a)                                                                \\
  for (auto y : a)                                                             \\
    cerr << y.ff << "," << y.ss << sp;                                         \\
  cerr << nl;

#define trace(a) cerr << a << nl;
#define trace2(a, b) cerr << a << sp << b << nl;
#define trace3(a, b, c) cerr << a << sp << b << sp << c << nl;
#define trace4(a, b, c, d) cerr << a << sp << b << sp << c << sp << d << nl;

#define gcd(a, b) __gcd(a, b)
#define lcm(a, b) ((a)*1ll * (b)) / gcd(a, b)

#define nl "\\n"
#define sp " "

using namespace std;
using namespace std::chrono;

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

#define ordered_set                                                            \\
  tree<pii, null_type, less<pii>, rb_tree_tag,                                 \\
       tree_order_statistics_node_update>
#define ok order_of_key
#define fo find_by_order

// ll md = 1000000007;
ll md = 924844033;
ld pi = 3.141592653;
// ll md = 998244353;

ll pw(ll a, ll b) {
  ll c = 1, m = a;
  while (b) {
    if (b & 1)
      c = (c * m);
    m = (m * m);
    b /= 2;
  }
  return c;
}

ll pwmd(ll a, ll b) {
  ll c = 1, m = a;
  while (b) {
    if (b & 1)
      c = (c * m) % md;
    m = (m * m) % md;
    b /= 2;
  }
  return c;
}

ll modinv(ll n) { return pwmd(n, md - 2); }

ll my_ceil(ll a, ll b) {
  if (a % b == 0)
    return a / b;
  return a / b + 1;
}

ll nc2(ll n) { return (1ll * n * (n - 1)) / 2; }

ll nsum(ll n) { return (1ll * n * (n + 1)) / 2; }

int my_log(ll n, int b) {
  ll i = 1;
  int ans = 0;
  while (1) {
    if (i > n / b)
      break;
    i *= b;
    ans++;
  }
  return ans;
}

inline int nc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}

inline int read() {
  int ret = 0;
  bool f = 0;
  char ch = nc();
  while (ch > '9' || ch < '0')
    f ^= ch == '-', ch = nc();
  while (ch <= '9' && ch >= '0')
    ret = ret * 10 + ch - '0', ch = nc();
  return f ? -ret : ret;
}

inline int randint(int l, int r) {
  mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  return uniform_int_distribution<int>(l, r)(rng);
}

inline ll randll(ll l, ll r) {
  mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
  return uniform_int_distribution<ll>(l, r)(rng);
}

int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

inline ll add(ll a, ll b) {
  return (((a >= md) ? a % md : a) + ((b >= md) ? b % md : b) + md) % md;
}
inline ll subt(ll a, ll b) { return (a - b + md) % md; }
inline ll mult(ll a, ll b) {
  return (1ll * ((a >= md) ? a % md : a) * ((b >= md) ? b % md : b)) % md;
}

inline int manhatten(pii p1, pii p2) {
  return abs(p1.ff - p2.ff) + abs(p1.ss - p2.ss);
}

inline bool kthbit(ll n, int k) { return (n >> k) & 1; }
inline ll setkthbit(ll n, int k) { return n | (1ll << k); }
inline ll unsetkthbit(ll n, int k) { return n & ~(1ll << k); }
inline ll flipkthbit(ll n, int k) { return n ^ (1ll << k); }

// #define int long long //UNCOMMENT IF NEEDED
#define UNAGI

/*
    You have to stop the Q-Tip when there's resistance!
                                - Chandler Bing, S02E01
*/

const int N = 5e5 + 5;

int a[N];

class Fenwick {
public:
  int fenwick[N];

  Fenwick() { mem(fenwick, 0); }

  void update(int idx, int val) {
    while (idx <= N) {
      fenwick[idx] += val;
      idx += idx & (-idx);
    }
  }

  int getSum(int idx) {
    ll ans = 0;
    while (idx > 0) {
      ans += fenwick[idx];
      idx -= idx & (-idx);
    }
    return ans;
  }
};

int32_t main() {
  fast;

#ifndef UNAGI
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif

  int h, e, m, y, n, k;
  int x, q, l, r, c;

  string s, t;

  auto start = high_resolution_clock::now();

  int tcnt = 0;

  int tests = 1;
  // pre();
  // cin >> tests;

  while (tests--) {
    // cout << "Case #" << ++tcnt << ": ";

    cin >> n >> q;
    f(i, 1, 1 + n) cin >> a[i];
    vector<pair<pii, int>> queries;
    f(i, 0, q) cin >> l >> r, queries.pb({{r, l}, i});
    srt(queries);
    int ans[q], last[n + 1];
    mem(last, -1);
    Fenwick fen;
    int ptr = 0;
    f(i, 1, 1 + n) {
      if (last[a[i]] != -1)
        fen.update(last[a[i]], -1);
      last[a[i]] = i;
      fen.update(i, 1);
      while (ptr < q && queries[ptr].ff.ff == i) {
        ans[queries[ptr].ss] =
            fen.getSum(queries[ptr].ff.ff) - fen.getSum(queries[ptr].ff.ss - 1);
        ptr++;
      }
    }
    f(i, 0, q) cout << ans[i] << nl;

    // RESTORE SEGTREE SIZE
  }
  auto stop = high_resolution_clock::now();
  auto duration = duration_cast<microseconds>(stop - start);
  cerr << "Time taken: " << duration.count() / 1000000.0 << "seconds" << nl;
  return 0;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <chrono>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <limits.h>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <unordered_map>

#define fast                                                                   \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(0);                                                                  \\
  cout.tie(0);

#define ll long long
#define ld long double

#define pb push_back
#define ins insert
#define er erase

#define f(i, a, b) for (int i = a; i < b; ++i)
#define rf(i, a, b) for (int i = a; i >= b; --i)
#define cmax(a, b) a = max(a, b)
#define cmin(a, b) a = min(a, b)
#define cadd(a, b) a = add(a, b)
#define csub(a, b) a = subt(a, b)
#define cmul(a, b) a = mult(a, b)
#define mem(a, b) memset(a, b, sizeof(a))

#define vi vector<int>
#define vst vector<string>
#define vpii vector<pii>
#define sz(a) (int)(a).size()

#define all(v) v.begin(), v.end()
#define lb lower_bound
#define ub upper_bound
#define mxe max_element
#define mne min_element

#define srt(v) sort(all(v))
#define rsrt(v) sort(v.rbegin(), v.rend())

#define pii pair<int, int>
#define ff first
#define ss second

#define bs bitset
#define bpc(a) __builtin_popcount(a)
#define prec(a) fixed << setprecision(a)

#define mii map<int, int>
#define umii unordered_map<int, int>

#define si set<int>
#define usi unordered_set<int>
#define spii set<pii>

#define dbg(a, st, end)                                                        \\
  f(i, st, end + 1) cerr << a[i] << sp;                                        \\
  cerr << nl;
#define pnt(a, st, end)                                                        \\
  f(i, st, end + 1) cout << a[i] << sp;                                        \\
  cout << nl;
#define dbgc(a)                                                                \\
  for (auto y : a)                                                             \\
    cerr << y << sp;                                                           \\
  cerr << nl;
#define dbgm(a)                                                                \\
  for (auto y : a)                                                             \\
    cerr << y.ff << "," << y.ss << sp;                                         \\
  cerr << nl;

#define trace(a) cerr << a << nl;
#define trace2(a, b) cerr << a << sp << b << nl;
#define trace3(a, b, c) cerr << a << sp << b << sp << c << nl;
#define trace4(a, b, c, d) cerr << a << sp << b << sp << c << sp << d << nl;

#define gcd(a, b) __gcd(a, b)
#define lcm(a, b) ((a)*1ll * (b)) / gcd(a, b)

#define nl "\\n"
#define sp " "

using namespace std;
using namespace std::chrono;

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

#define ordered_set                                                            \\
  tree<pii, null_type, less<pii>, rb_tree_tag,                                 \\
       tree_order_statistics_node_update>
#define ok order_of_key
#define fo find_by_order

// ll md = 1000000007;
ll md = 924844033;
ld pi = 3.141592653;
// ll md = 998244353;

ll pw(ll a, ll b) {
  ll c = 1, m = a;
  while (b) {
    if (b & 1)
      c = (c * m);
    m = (m * m);
    b /= 2;
  }
  return c;
}

ll pwmd(ll a, ll b) {
  ll c = 1, m = a;
  while (b) {
    if (b & 1)
      c = (c * m) % md;
    m = (m * m) % md;
    b /= 2;
  }
  return c;
}

ll modinv(ll n) { return pwmd(n, md - 2); }

ll my_ceil(ll a, ll b) {
  if (a % b == 0)
    return a / b;
  return a / b + 1;
}

ll nc2(ll n) { return (1ll * n * (n - 1)) / 2; }

ll nsum(ll n) { return (1ll * n * (n + 1)) / 2; }

int my_log(ll n, int b) {
  ll i = 1;
  int ans = 0;
  while (1) {
    if (i > n / b)
      break;
    i *= b;
    ans++;
  }
  return ans;
}

inline int nc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}

inline int read() {
  int ret = 0;
  bool f = 0;
  char ch = nc();
  while (ch > '9' || ch < '0')
    f ^= ch == '-', ch = nc();
  while (ch <= '9' && ch >= '0')
    ret = ret * 10 + ch - '0', ch = nc();
  return f ? -ret : ret;
}

inline int randint(int l, int r) {
  mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  return uniform_int_distribution<int>(l, r)(rng);
}

inline ll randll(ll l, ll r) {
  mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
  return uniform_int_distribution<ll>(l, r)(rng);
}

int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

inline ll add(ll a, ll b) {
  return (((a >= md) ? a % md : a) + ((b >= md) ? b % md : b) + md) % md;
}
inline ll subt(ll a, ll b) { return (a - b + md) % md; }
inline ll mult(ll a, ll b) {
  return (1ll * ((a >= md) ? a % md : a) * ((b >= md) ? b % md : b)) % md;
}

inline int manhatten(pii p1, pii p2) {
  return abs(p1.ff - p2.ff) + abs(p1.ss - p2.ss);
}

inline bool kthbit(ll n, int k) { return (n >> k) & 1; }
inline ll setkthbit(ll n, int k) { return n | (1ll << k); }
inline ll unsetkthbit(ll n, int k) { return n & ~(1ll << k); }
inline ll flipkthbit(ll n, int k) { return n ^ (1ll << k); }

#define int long long // UNCOMMENT IF NEEDED
#define UNAGI

/*
    You have to stop the Q-Tip when there's resistance!
                                - Chandler Bing, S02E01
*/

const int N = 5e5 + 5;
int a[N], cnt[N], ans, res[N];
int blocksize;
vector<pair<pii, int>> queries;

bool mocmp(pair<pii, int> x, pair<pii, int> y) {
  int blockx = x.ff.ff / blocksize, blocky = y.ff.ff / blocksize;
  if (blocky != blockx)
    return blockx < blocky;
  return x.ff.ss < y.ff.ss;
}

void add(int idx) {
  ans += (bool)(!cnt[a[idx]]);
  cnt[a[idx]]++;
}

void remove(int idx) {
  cnt[a[idx]]--;
  ans -= (bool)(!cnt[a[idx]]);
}

void Mo() {
  int left = 0, right = -1;
  for (auto y : queries) {
    int l = y.ff.ff, r = y.ff.ss;
    while (right < r)
      add(++right);
    while (right > r)
      remove(right--);
    while (left < l)
      remove(left++);
    while (left > l)
      add(--left);
    res[y.ss] = ans;
  }
}

int32_t main() {
  fast;

#ifndef UNAGI
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif

  int h, e, m, y, n, k;
  int x, q, l, r, c;

  string s, t;

  auto start = high_resolution_clock::now();

  int tcnt = 0;

  int tests = 1;
  // pre();
  // cin >> tests;

  while (tests--) {
    // cout << "Case #" << ++tcnt << ": ";

    cin >> n >> q;
    f(i, 0, n) cin >> a[i];
    f(i, 0, q) cin >> l >> r, queries.pb({{l - 1, r - 1}, i});
    blocksize = (int)sqrt(n);
    srt(queries);
    Mo();
    f(i, 0, q) cout << res[i] << nl;

    // RESTORE SEGTREE SIZE
  }
  auto stop = high_resolution_clock::now();
  auto duration = duration_cast<microseconds>(stop - start);
  cerr << "Time taken: " << duration.count() / 1000000.0 << "seconds" << nl;
  return 0;
}