Problem p02599 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
const int N = 30010;
const int S = 200010;
int arr[N];
int L[S];
int R[S];
int seg[4 * N];
int ans[S];
vector<pair<pair<int, int>, int>> Q;
map<int, int> lst;
bool cmp(pair<pair<int, int>, int> A, pair<pair<int, int>, int> B) {
  if (A.first.second == B.first.second)
    return A.first.first < B.first.first;
  return A.first.second < B.first.second;
}
void update(int pos, int val, int st, int en, int idx) {
  if (st == en && st == pos) {
    seg[idx] = val;
    return;
  }
  int mid = st + (en - st) / 2;
  if (pos <= mid)
    update(pos, val, st, mid, 2 * idx);
  else
    update(pos, val, mid + 1, en, 2 * idx + 1);
  seg[idx] = seg[2 * idx] + seg[2 * idx + 1];
}
long long query(int l, int r, int st, int en, int idx) {
  // cout<<l<<" "<<r<<endl;
  if (l > en || r < st || st > en)
    return 0;
  if (l <= st && r >= en)
    return seg[idx];
  int mid = st + (en - st) / 2;
  return query(l, r, st, mid, 2 * idx) + query(l, r, mid + 1, en, 2 * idx + 1);
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, q, l, r;
  // cin>>n;
  scanf("%d%d", &n, &q);
  for (int i = 0; i < n; i++)
    scanf("%d", &arr[i]);
  // cin>>arr[i];

  for (int i = 0; i < q; i++) {
    // cin>>l>>r;
    scanf("%d%d", &l, &r);
    l--, r--;
    L[i] = l;
    R[i] = r;
    Q.push_back({{l, r}, i});
  }
  sort(Q.begin(), Q.end(), cmp);
  memset(seg, 0, sizeof(seg));
  int j = 0;
  int pos;
  for (int i = 0; i < n; i++) {
    pos = Q[j].second;
    l = L[pos];
    r = R[pos];
    if (lst.count(arr[i]) > 0)
      update(lst[arr[i]], 0, 0, n - 1, 1);
    update(i, 1, 0, n - 1, 1);
    lst[arr[i]] = i;
    while (r == i && j < q) {
      ans[pos] = query(l, r, 0, n - 1, 1);
      j++;
      if (j == q)
        break;
      pos = Q[j].second;
      l = L[pos];
      r = R[pos];
    }
  }
  for (int i = 0; i < q; i++)
    printf("%d\n", ans[i]);
  // cout<<ans[i]<<"\n";
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 2;
const int S = 5e5 + 2;
int arr[N];
int L[S];
int R[S];
int seg[4 * N];
int ans[S];
vector<pair<pair<int, int>, int>> Q;
map<int, int> lst;
bool cmp(pair<pair<int, int>, int> A, pair<pair<int, int>, int> B) {
  if (A.first.second == B.first.second)
    return A.first.first < B.first.first;
  return A.first.second < B.first.second;
}
void update(int pos, int val, int st, int en, int idx) {
  if (st == en && st == pos) {
    seg[idx] = val;
    return;
  }
  int mid = st + (en - st) / 2;
  if (pos <= mid)
    update(pos, val, st, mid, 2 * idx);
  else
    update(pos, val, mid + 1, en, 2 * idx + 1);
  seg[idx] = seg[2 * idx] + seg[2 * idx + 1];
}
long long query(int l, int r, int st, int en, int idx) {
  // cout<<l<<" "<<r<<endl;
  if (l > en || r < st || st > en)
    return 0;
  if (l <= st && r >= en)
    return seg[idx];
  int mid = st + (en - st) / 2;
  return query(l, r, st, mid, 2 * idx) + query(l, r, mid + 1, en, 2 * idx + 1);
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, q, l, r;
  // cin>>n;
  scanf("%d%d", &n, &q);
  for (int i = 0; i < n; i++)
    scanf("%d", &arr[i]);
  // cin>>arr[i];

  for (int i = 0; i < q; i++) {
    // cin>>l>>r;
    scanf("%d%d", &l, &r);
    l--, r--;
    L[i] = l;
    R[i] = r;
    Q.push_back({{l, r}, i});
  }
  sort(Q.begin(), Q.end(), cmp);
  memset(seg, 0, sizeof(seg));
  int j = 0;
  int pos;
  for (int i = 0; i < n; i++) {
    pos = Q[j].second;
    l = L[pos];
    r = R[pos];
    if (lst.count(arr[i]) > 0)
      update(lst[arr[i]], 0, 0, n - 1, 1);
    update(i, 1, 0, n - 1, 1);
    lst[arr[i]] = i;
    while (r == i && j < q) {
      ans[pos] = query(l, r, 0, n - 1, 1);
      j++;
      if (j == q)
        break;
      pos = Q[j].second;
      l = L[pos];
      r = R[pos];
    }
  }
  for (int i = 0; i < q; i++)
    printf("%d\n", ans[i]);
  // cout<<ans[i]<<"\n";
  return 0;
}