Problem p02599 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
#define N 200000
#define mod1 1000000007
#define mod2 1000000009
#define mod3 998244353
#define endl '\n'
#define IO                                                                     \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);
vector<ll> a(N + 5), b(N + 5);
vector<ll> segtree[4 * N + 5];
void build(ll ptr, ll start, ll end) {
  if (start == end) {
    segtree[ptr].push_back(a[start]);
    return;
  }
  ll mid = (start + end) / 2;
  build(2 * ptr, start, mid);
  build(2 * ptr + 1, mid + 1, end);
  ll pointer1 = 0, pointer2 = 0;
  while (pointer1 < segtree[2 * ptr].size() &&
         pointer2 < segtree[2 * ptr + 1].size()) {
    if (segtree[2 * ptr][pointer1] < segtree[2 * ptr + 1][pointer2]) {
      segtree[ptr].push_back(segtree[2 * ptr][pointer1]);
      pointer1++;
    } else {
      segtree[ptr].push_back(segtree[2 * ptr + 1][pointer2]);
      pointer2++;
    }
  }
  while (pointer1 < segtree[2 * ptr].size()) {
    segtree[ptr].push_back(segtree[2 * ptr][pointer1]);
    pointer1++;
  }
  while (pointer2 < segtree[2 * ptr + 1].size()) {
    segtree[ptr].push_back(segtree[2 * ptr + 1][pointer2]);
    pointer2++;
  }
  return;
}
ll query(ll ptr, ll l, ll r, ll val, ll start, ll end) {
  if (start > r || l > end)
    return 0;
  else if (start >= l && r >= end) {
    ll count = lower_bound(segtree[ptr].begin(), segtree[ptr].end(), val) -
               segtree[ptr].begin();
    return (segtree[ptr].size() - count);
  } else {
    ll mid = (start + end) / 2;
    return (query(2 * ptr, l, r, val, start, mid) +
            query(2 * ptr + 1, l, r, val, mid + 1, end));
  }
}
int main() {
  IO clock_t begin = clock();
  ll n, q;
  cin >> n >> q;
  map<ll, ll> mp;
  for (ll i = 1; i <= n; i++)
    cin >> a[i];
  for (ll i = 1; i <= n; i++)
    b[i] = a[i];
  for (ll i = n; i >= 1; i--) {
    a[i] = (mp[b[i]] == 0 ? n + 1 : mp[b[i]]);
    mp[b[i]] = i;
  }
  // for(ll i=1;i<=n;i++)
  // 	cout<<a[i]<<' ';
  // cout<<endl;
  build(1, 1, n);
  while (q--) {
    ll l, r;
    cin >> l >> r;
    ll ans = query(1, l, r, r + 1, 1, n);
    cout << ans << '\n';
  }
  // cout<<double(clock() - begin)/CLOCKS_PER_SEC<<endl;
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 500000
#define mod1 1000000007
#define mod2 1000000009
#define mod3 998244353
#define endl '\n'
#define IO                                                                     \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);
vector<ll> a(N + 5), b(N + 5);
vector<ll> segtree[4 * N + 5];
void build(ll ptr, ll start, ll end) {
  if (start == end) {
    segtree[ptr].push_back(a[start]);
    return;
  }
  ll mid = (start + end) / 2;
  build(2 * ptr, start, mid);
  build(2 * ptr + 1, mid + 1, end);
  ll pointer1 = 0, pointer2 = 0;
  while (pointer1 < segtree[2 * ptr].size() &&
         pointer2 < segtree[2 * ptr + 1].size()) {
    if (segtree[2 * ptr][pointer1] < segtree[2 * ptr + 1][pointer2]) {
      segtree[ptr].push_back(segtree[2 * ptr][pointer1]);
      pointer1++;
    } else {
      segtree[ptr].push_back(segtree[2 * ptr + 1][pointer2]);
      pointer2++;
    }
  }
  while (pointer1 < segtree[2 * ptr].size()) {
    segtree[ptr].push_back(segtree[2 * ptr][pointer1]);
    pointer1++;
  }
  while (pointer2 < segtree[2 * ptr + 1].size()) {
    segtree[ptr].push_back(segtree[2 * ptr + 1][pointer2]);
    pointer2++;
  }
  return;
}
ll query(ll ptr, ll l, ll r, ll val, ll start, ll end) {
  if (start > r || l > end)
    return 0;
  else if (start >= l && r >= end) {
    ll count = lower_bound(segtree[ptr].begin(), segtree[ptr].end(), val) -
               segtree[ptr].begin();
    return (segtree[ptr].size() - count);
  } else {
    ll mid = (start + end) / 2;
    return (query(2 * ptr, l, r, val, start, mid) +
            query(2 * ptr + 1, l, r, val, mid + 1, end));
  }
}
int main() {
  IO clock_t begin = clock();
  ll n, q;
  cin >> n >> q;
  map<ll, ll> mp;
  for (ll i = 1; i <= n; i++)
    cin >> a[i];
  for (ll i = 1; i <= n; i++)
    b[i] = a[i];
  for (ll i = n; i >= 1; i--) {
    a[i] = (mp[b[i]] == 0 ? n + 1 : mp[b[i]]);
    mp[b[i]] = i;
  }
  // for(ll i=1;i<=n;i++)
  // 	cout<<a[i]<<' ';
  // cout<<endl;
  build(1, 1, n);
  while (q--) {
    ll l, r;
    cin >> l >> r;
    ll ans = query(1, l, r, r + 1, 1, n);
    cout << ans << '\n';
  }
  // cout<<double(clock() - begin)/CLOCKS_PER_SEC<<endl;
  return 0;
}