Problem p02599 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;

void coordinate_compression(vector<int> &a) {
  int petr = 1;
  map<int, int> mp;
  for (int &i : a) {
    if (!mp[i]) {
      mp[i] = petr++;
    }
    i = mp[i];
  }
}

const int BLOCK_SIZE = 600;

struct Query {
  int l, r, idx;

  Query(int L, int R, int ID) { l = L, r = R, idx = ID; }

  bool operator<(Query other) const {
    if (l / BLOCK_SIZE != other.l / BLOCK_SIZE)
      return make_pair(l, r) < make_pair(other.l, other.r);
    return (l / BLOCK_SIZE & 1) ? (r < other.r) : (r > other.r);
  }
};

vector<int> Mo(vector<Query> queries, vector<int> &a) {
  vector<int> answers(queries.size());
  sort(queries.begin(), queries.end());

  vector<int> cnt(500001);

  int cur_l = 0, cur_r = -1, cur = 0;
  for (Query q : queries) {
    while (cur_l > q.l) {
      cur_l--;
      cnt[a[cur_l]]++;
      if (cnt[a[cur_l]] == 1)
        cur++;
    }
    while (cur_r < q.r) {
      cur_r++;
      cnt[a[cur_r]]++;
      if (cnt[a[cur_r]] == 1)
        cur++;
    }
    while (cur_l < q.l) {
      cnt[a[cur_l]]--;
      if (cnt[a[cur_l]] == 0)
        cur--;
      cur_l++;
    }
    while (cur_r > q.r) {
      cnt[a[cur_r]]--;
      if (cnt[a[cur_r]] == 0)
        cur--;
      cur_r--;
    }
    answers[q.idx] = cur;
  }
  return answers;
}

signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);

  int n, q;
  cin >> n >> q;
  vector<int> a(n);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  coordinate_compression(a);

  vector<Query> qr;
  for (int i = 0; i < q; i++) {
    int l, r;
    cin >> l >> r;
    qr.push_back(Query(l - 1, r - 1, i));
  }

  vector<int> ans = Mo(qr, a);
  for (int i : ans)
    cout << i << '\\n';

  return 0;
}


Error: 0

Fixed submission:

#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#define x first
#define y second
#define pii pair<int, int>
#define pb push_back
#define eb emplace_back

using namespace std;
using namespace __gnu_pbds;

typedef long long int ll;
typedef unsigned long long int ull;
int MOD = 1000000007;
int MOD2 = 998244353;
vector<int> bases;
const ll LLINF = 1ll << 60;
const char en = '\\n';

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
void yes() {
  cout << "YES" << en;
  exit(0);
}
void no() {
  cout << "NO" << en;
  exit(0);
}
inline int rund() {
  int x576363482791fuweh = rng();
  return abs(x576363482791fuweh) % RAND_MAX;
}
template <class T> void prVec(vector<T> w) {
  cout << w.size() << endl;
  for (int i = 0; i < int(w.size()) - 1; ++i)
    cout << w[i] << ' ';
  if (w.size())
    cout << w[w.size() - 1] << endl;
}

void M998() { swap(MOD, MOD2); }

ll raand() {
  ll a = rund();
  a *= RAND_MAX;
  a += rund();
  return a;
}

#define rand raand

ll raaand() { return raand() * (MOD - 7) + raand(); }

string to_upper(string a) {
  for (int i = 0; i < (int)a.size(); ++i)
    if (a[i] >= 'a' && a[i] <= 'z')
      a[i] -= 'a' - 'A';
  return a;
}

string to_lower(string a) {
  for (int i = 0; i < (int)a.size(); ++i)
    if (a[i] >= 'A' && a[i] <= 'Z')
      a[i] += 'a' - 'A';
  return a;
}

ll sti(string a) {
  ll k = 0;
  for (int i = 0; i < (int)a.size(); ++i) {
    k *= 10;
    k += a[i] - '0';
  }
  return k;
}

string its(ll k) {
  if (k == 0)
    return "0";
  string a;
  while (k) {
    a.push_back((k % 10) + '0');
    k /= 10;
  }
  reverse(a.begin(), a.end());
  return a;
}

ll min(ll a, int b) {
  if (a < b)
    return a;
  return b;
}

ll min(int a, ll b) {
  if (a < b)
    return a;
  return b;
}

ll max(ll a, int b) {
  if (a > b)
    return a;
  return b;
}

ll max(int a, ll b) {
  if (a > b)
    return a;
  return b;
}

ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}

ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

template <class T, class K> pair<T, K> mp(T a, K b) { return make_pair(a, b); }

inline int mult(ll a, ll b) { return (a * b) % MOD; }

inline int pot(int n, int k) {
  if (k == 0)
    return 1;
  ll a = pot(n, k / 2);
  a = mult(a, a);
  if (k % 2)
    return mult(a, n);
  else
    return a;
}

int divide(int a, int b) { return mult(a, pot(b, MOD - 2)); }

inline int sub(int a, int b) {
  if (a - b >= 0)
    return a - b;
  return a - b + MOD;
}

inline int add(int a, int b) {
  if (a + b >= MOD)
    return a + b - MOD;
  return a + b;
}

bool prime(ll a) {
  if (a == 1)
    return 0;
  for (int i = 2; i <= round(sqrt(a)); ++i) {
    if (a % i == 0)
      return 0;
  }
  return 1;
}

ll has(string x) {
  ll h1 = 0, h2 = 0;
  x = to_lower(x);
  for (char a : x) {
    h1 *= bases[0];
    h1 += a - 'a';
    h1 %= bases[3];
    h2 *= bases[1];
    h2 += a - 'a';
    h2 %= bases[4];
  }
  return h1 * (MOD + 13893829) + h2;
}

struct oph {
  static uint64_t splitmix64(uint64_t x) {
    // http://xorshift.di.unimi.it/splitmix64.c
    x += 0x9e3779b97f4a7c15;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
    x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
    return x ^ (x >> 31);
  }

  size_t operator()(uint64_t x) const {
    static const uint64_t FIXED_RANDOM =
        chrono::steady_clock::now().time_since_epoch().count();
    return splitmix64(x + FIXED_RANDOM);
  }
};

const int N = 200010, M = 1000;
int n, h[N], q, la[N], fen[N], ans[N];
vector<int> s;
gp_hash_table<int, int, oph> g;
vector<pii> x[N];
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};

void upd(int i) {
  for (; i <= n; i += i & -i)
    ++fen[i];
}

int que(int i) {
  int s = 0;
  for (; i; i -= i & -i)
    s += fen[i];
  return s;
}

#define gc getchar_unlocked

int read() {
  char c = gc();
  // cout<<int(c)<<endl;
  int zz = 0;
  while (c == 0 || c == -1 || c == ' ' || c == '\\n' || c == '\\r') {
    c = gc();
    //++zz;
  }
  int t = 0, z = 0;
  while (c != ' ' && c != '\\n' && c != -1 && c && c != '\\r') {
    t = t * 10 + c - '0';
    //++z;
    c = gc();
  }
  return t;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  for (int i = 0; i < 10; ++i)
    bases.push_back(rand() % (MOD - 13893829) + 13893829);
  const bool rea = 1;
  if (rea)
    n = read(), q = read();
  else
    n = q = N - 10;
  for (int i = 0; i < n; ++i) {
    if (rea)
      h[i] = read();
    else
      h[i] = rand() % M + 1;
    s.pb(h[i]);
  }
  int i = 0;
  for (auto a : s)
    g[a] = i++;
  for (int i = 0; i < n; ++i)
    h[i] = g[h[i]];
  for (int i = 0; i < n; ++i) {
    int a = h[i];
    h[i] = la[a] + 1;
    la[a] = i + 1;
    // cout<<h[i]<<' '<<a<<en;
  }
  // exit(0);
  for (int i = 0; i < q; ++i) {
    int a, b;
    if (rea)
      a = read(), b = read();
    else
      b = rand() % n + 1, a = rand() % b + 1;
    x[b - 1].pb({i, a});
  }
  // exit(0);
  for (int i = 0; i < n; ++i) {
    upd(h[i]);
    for (auto w : x[i]) {
      ans[w.x] = que(w.y) - w.y + 1;
    }
  }
  ll S = 0;
  for (int i = 0; i < q; ++i)
    if (rea)
      cout << ans[i] << en;
    else
      S += ans[i];
  if (!rea)
    cout << S;
}