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

#include <bits/stdc++.h>
#define pb push_back
#define pf push_front
using namespace std;
typedef long long int lli;

lli n, k, l, m, t, a, b, s, r, c, temp1, temp2, x, y, temp, q, d, mod = 1e9 + 7,
                                                                  w;

lli arr[500005];
lli fenwick[500005];
lli ans[500005];

lli getParent(lli n) { return (n & (n - 1)); }

lli getNext(lli n) {
  lli tc = (~n) + 1;

  lli val = (tc & n);

  lli retVal = val + n;

  return retVal;
}

lli prefSum(lli r) {
  lli sum = 0;
  lli node = r;

  while (node != 0) {
    sum += fenwick[node];
    node = getParent(node);
  }

  return sum;
}

lli update(lli index, lli val) {
  if (index > n)
    return 0;

  fenwick[index] += val;
  return update(getNext(index), val);
}

map<lli, lli> lastSeen;

void leftRangeUpdate(lli curLeft) {
  if (lastSeen.find(arr[curLeft - 1]) == lastSeen.end()) {
    update(curLeft, 1);

    lastSeen.insert({arr[curLeft - 1], curLeft - 1});
  } else {
    update(lastSeen[arr[curLeft - 1]] + 1, -1);

    update(curLeft, 1);

    lastSeen[arr[curLeft - 1]] = curLeft - 1;
  }
}

multimap<pair<lli, lli>, lli, greater<pair<lli, lli>>> queries;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> q;

  for (int i = 0; i < n; i++)
    cin >> arr[i];

  for (int i = 1; i <= q; i++) {
    cin >> l >> r;
    queries.insert({{l - 1, r - 1}, i});
  }

  lastSeen.insert({arr[n - 1], n - 1});

  update(n, 1);

  lli curLeft = n - 1;

  for (auto x : queries) {
    while (x.first.first != curLeft) {
      leftRangeUpdate(curLeft);
      curLeft--;
    }

    ans[x.second] = prefSum(x.first.second + 1);
  }

  for (int i = 1; i <= q; i++) {
    cout << ans[i] << endl;
  }
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
#define pb push_back
#define pf push_front
using namespace std;
typedef long long int lli;

lli n, k, l, m, t, a, b, s, r, c, temp1, temp2, x, y, temp, q, d, mod = 1e9 + 7,
                                                                  w;

lli arr[500005];
lli fenwick[500005];
lli ans[500005];

lli getParent(lli n) { return (n & (n - 1)); }

lli getNext(lli n) {
  lli tc = (~n) + 1;

  lli val = (tc & n);

  lli retVal = val + n;

  return retVal;
}

lli prefSum(lli r) {
  lli sum = 0;
  lli node = r;

  while (node != 0) {
    sum += fenwick[node];
    node = getParent(node);
  }

  return sum;
}

lli update(lli index, lli val) {
  if (index > n)
    return 0;

  fenwick[index] += val;
  return update(getNext(index), val);
}

map<lli, lli> lastSeen;

lli leftRangeUpdate(lli curLeft) {
  if (lastSeen.find(arr[curLeft - 1]) == lastSeen.end()) {
    update(curLeft, 1);

    lastSeen.insert({arr[curLeft - 1], curLeft - 1});
  } else {
    update(lastSeen[arr[curLeft - 1]] + 1, -1);

    update(curLeft, 1);

    lastSeen[arr[curLeft - 1]] = curLeft - 1;
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> q;

  for (int i = 0; i < n; i++)
    cin >> arr[i];

  multimap<pair<lli, lli>, lli, greater<pair<lli, lli>>> queries;

  for (int i = 1; i <= q; i++) {
    cin >> l >> r;
    queries.insert({{l - 1, r - 1}, i});
  }

  lastSeen.insert({arr[n - 1], n - 1});

  update(n, 1);

  lli curLeft = n - 1;

  for (auto x : queries) {
    while (x.first.first != curLeft) {
      leftRangeUpdate(curLeft);
      curLeft--;
    }

    ans[x.second] = prefSum(x.first.second + 1);
  }

  for (int i = 1; i <= q; i++) {
    cout << ans[i] << endl;
  }
}