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

#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>

#ifndef M_PI
#define M_PI 3.14159265358979
#endif
#define deg_to_rad(deg) (((deg) / 360) * 2 * M_PI)
#define rad_to_deg(rad) (((rad) / 2 / M_PI) * 360)

using namespace std;

typedef long long ll;
typedef vector<long long> vll;
typedef vector<int> vi;
typedef pair<long long, long long> pll;
typedef pair<int, int> pi;
typedef long double ld;
typedef pair<long double, long double> pld;

const ll INF = 1e15;
const ll MOD = 1e9 + 7;
const int MAX_N = 500000;

int cnt[MAX_N];
int C[MAX_N];
int ans = 0;

// void init(int N) { cnt = vi(N, 0); }

void add(int p) {
  // pの位置をクエリ範囲に加えるときの処理
  if (cnt[C[p]]++ == 0)
    ans++;
}

void del(int p) {
  // pの位置をクエリ範囲から除くときの処理
  if (--cnt[C[p]] == 0)
    ans--;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int i, j, k;
  int N, Q;
  cin >> N >> Q;
  for (i = 0; i < N; i++) {
    int c;
    cin >> c;
    C[i] = c;
  }
  // init(N);

  vector<pi> LR(Q);
  for (i = 0; i < Q; i++) {
    int l, r;
    cin >> l >> r;
    l--;
    LR[i] = pi(l, r);
  }

  vi qi(Q);
  for (i = 0; i < Q; i++) {
    qi[i] = i;
  }
  int sq = sqrt(N);
  sort(qi.begin(), qi.end(), [&](int i, int j) {
    if (LR[i].first / sq != LR[j].first / sq)
      return LR[i].first < LR[j].first;
    // return LR[i].second < LR[j].second;
    return bool((LR[i].second < LR[j].second) ^ (LR[i].first / sq % 2));
  });

  int nl = 0, nr = 0;
  vi vans(Q);
  for (auto i : qi) {
    while (nl > LR[i].first)
      add(--nl);
    while (nr < LR[i].second)
      add(nr++);
    while (nl < LR[i].first)
      del(nl++);
    while (nr > LR[i].second)
      del(--nr);
    vans[i] = ans;
  }

  for (i = 0; i < Q; i++) {
    cout << vans[i] << "\\n";
  }
  return 0;
}


Error: TLE

Fixed submission:

#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>

#ifndef M_PI
#define M_PI 3.14159265358979
#endif
#define deg_to_rad(deg) (((deg) / 360) * 2 * M_PI)
#define rad_to_deg(rad) (((rad) / 2 / M_PI) * 360)

using namespace std;

typedef long long ll;
typedef vector<long long> vll;
typedef vector<int> vi;
typedef pair<long long, long long> pll;
typedef pair<int, int> pi;
typedef long double ld;
typedef pair<long double, long double> pld;

const ll INF = 1e15;
const ll MOD = 1e9 + 7;
const int MAX_N = 500000;

int cnt[MAX_N];
int C[MAX_N];
int ans = 0;

// void init(int N) { cnt = vi(N, 0); }

void add(int p) {
  // pの位置をクエリ範囲に加えるときの処理
  if (cnt[C[p]]++ == 0)
    ans++;
}

void del(int p) {
  // pの位置をクエリ範囲から除くときの処理
  if (--cnt[C[p]] == 0)
    ans--;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int i, j, k;
  int N, Q;
  cin >> N >> Q;
  for (i = 0; i < N; i++) {
    int c;
    cin >> c;
    C[i] = c;
  }
  // init(N);

  vector<pi> LR(Q);
  for (i = 0; i < Q; i++) {
    int l, r;
    cin >> l >> r;
    l--;
    LR[i] = pi(l, r);
  }

  vi qi(Q);
  for (i = 0; i < Q; i++) {
    qi[i] = i;
  }
  int sq = sqrt(N);
  sort(qi.begin(), qi.end(), [&](int i, int j) {
    if (LR[i].first / sq != LR[j].first / sq)
      return LR[i].first < LR[j].first;
    return LR[i].second < LR[j].second;
    // return bool((LR[i].second < LR[j].second) ^ (LR[i].first / sq % 2));
  });

  int nl = 0, nr = 0;
  vi vans(Q);
  for (auto i : qi) {
    while (nl > LR[i].first)
      add(--nl);
    while (nr < LR[i].second)
      add(nr++);
    while (nl < LR[i].first)
      del(nl++);
    while (nr > LR[i].second)
      del(--nr);
    vans[i] = ans;
  }

  for (i = 0; i < Q; i++) {
    cout << vans[i] << "\\n";
  }
  return 0;
}