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

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

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}

#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define rep1(i, n) for (ll i = 1; i <= (ll)(n); i++)
#define INF 10000000000
#define MOD 1000000007
using ll = long long;
using pint = pair<int, int>;
using pll = pair<ll, ll>;
using Graph = vector<vector<int>>;

// BIT,O(log(N))
int N;
int bit[500010];
// v[a] += w
void add(int a, int w) {
  for (int x = a; x <= N; x += x & -x)
    bit[x] += w;
}
// v[1] + ... + v[a]
int sum(int a) {
  int res = 0;
  for (int x = a; x > 0; x -= x & -x)
    res += bit[x];
  return res;
}
// v[l] + ... + v[r]
int range_sum(int l, int r) { return sum(r) - sum(l - 1); }

int main() {
  int Q;
  cin >> N >> Q;

  vector<int> res(Q + 1, 0);
  vector<int> A(N + 1, 0); // A[i] 種類iの玉の最も右側のインデックス。
  vector<int> C(N + 1, 0); // C[i] i番目の玉
  vector<vector<int>> q_l(N + 1), q_ind(N + 1);

  rep1(i, N) cin >> C[i]; // 1-ind
  rep(i, Q) {
    int l, r;
    cin >> l >> r;
    q_l[r].push_back(l);
    q_ind[r].push_back(i);
  }
  rep(i, 5e5 + 10) bit[i] = 0;
  rep1(i, N) A[i] = 0;
  rep1(i, N) {
    // 左端から順に玉を見ていく。
    if (A[C[i]] > 0)
      add(A[C[i]], -1);
    add(i, 1);
    A[C[i]] = i; // C[i]の最も右側のindはiである。
    rep(j, q_l[i].size()) { res[q_ind[i][j]] = range_sum(q_l[i][j], i); }
  }
  rep(i, Q) cout << res[i] << endl;
}


Error: WA

Fixed submission:

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

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}

#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define rep1(i, n) for (ll i = 1; i <= (ll)(n); i++)
#define INF 10000000000
#define MOD 1000000007
using ll = long long;
using pint = pair<int, int>;
using pll = pair<ll, ll>;
using Graph = vector<vector<int>>;

int N, Q;

// BIT,O(log(N))
int bit[500010];
// v[a] += w
void add(int a, int w) {
  for (int x = a; x <= N; x += x & -x)
    bit[x] += w;
}
// v[1] + ... + v[a]
int sum(int a) {
  int ans = 0;
  for (int x = a; x > 0; x -= x & -x)
    ans += bit[x];
  return ans;
}
// v[l] + ... + v[r]
int range_sum(int l, int r) { return sum(r) - sum(l - 1); }

int main() {
  cin >> N >> Q;

  vector<int> res(N + 1, 0); // res[i] クエリiの答え
  // 1-index
  vector<int> A(N + 1, 0); // A[i] 種類iの玉の最も右側のインデックス。
  vector<int> C(N + 1, 0); // C[i] i番目の玉
  vector<vector<int>> q_l(N + 1); // q_l[r] 右端がrのときの左端のindexnの配列。
  vector<vector<int>> q_ind(N + 1); // q_ind[r] 右端がrのときの問題の0-index

  rep1(i, N) cin >> C[i];
  rep(i, Q) {
    int l, r;
    cin >> l >> r;
    q_l[r].push_back(l);
    q_ind[r].push_back(i);
  }

  rep(i, 500009) bit[i] =
      0; // bit[i] = i番目の玉がその種類の中で最も右端だったら１
  // rep1(i,N){
  //     //左端から順に玉を見ていく。
  //     if(A[C[i]]>0)add(A[C[i]],-1); //bit[A[C[i]]] = 0にする。
  //     add(i,+1); //bit[i] = 1にする。
  //     A[C[i]]=i;//C[i]の最も右側のindはiである。
  //     rep(j,q_l[i].size()){
  //         res[q_ind[i][j]] = range_sum(q_l[i][j],i);
  //     }
  // }
  rep(i, Q) cout << res[i] << endl;
}