Problem p02599 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;
#define ALL(x) x.begin(), x.end()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define debug(v)                                                               \\
  cout << #v << ":";                                                           \\
  for (auto x : v) {                                                           \\
    cout << x << ' ';                                                          \\
  }                                                                            \\
  cout << endl;
#define mod 1000000007
using ll = long long;
const int INF = 1000000000;
const ll LINF = 1001002003004005006ll;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
// ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

struct IOSetup {
  IOSetup() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout << fixed << setprecision(12);
  }
} iosetup;

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  os << p.first << " " << p.second;
  return os;
}

template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  for (int i = 0; i < (int)v.size(); i++)
    os << v[i] << (i + 1 == v.size() ? "" : " ");
  return os;
}

struct RangeTree {
  // xの各値がyのソート済み配列を持つ
  vector<vector<int>> seg;
  vector<int> x;
  int sz;
  RangeTree(vector<pair<int, int>> a) {
    sz = 1;
    while ((int)a.size() > sz)
      sz <<= 1;
    sort(begin(a), end(a));
    if (a.size())
      x.push_back(a[0].first);
    for (auto &p : a)
      if (x.back() != p.first)
        x.push_back(p.first);
    while (x.size() < sz)
      x.push_back(INF);
    seg.resize(2 * sz);
    int pos = 0;
    for (auto &p : a) {
      if (x[pos] != p.first)
        pos++;
      seg[pos + sz].push_back(p.second);
    }
    for (int i = sz - 1; i > 0; i--) {
      seg[i].resize(seg[2 * i].size() + seg[2 * i + 1].size());
      merge(begin(seg[2 * i]), end(seg[2 * i]), begin(seg[2 * i + 1]),
            end(seg[2 * i + 1]), begin(seg[i]));
    }
  }
  // [x1,x2),[y1,y2)
  int count(int x1, int y1, int x2, int y2) {
    int l = lower_bound(begin(x), end(x), x1) - begin(x),
        r = lower_bound(begin(x), end(x), x2) - begin(x);
    l += sz, r += sz;
    int ret = 0;
    for (; l < r; l >>= 1, r >>= 1) {
      if (l & 1) {
        ret += lower_bound(begin(seg[l]), end(seg[l]), y2) -
               lower_bound(begin(seg[l]), end(seg[l]), y1);
        l++;
      }
      if (r & 1) {
        r--;
        ret += lower_bound(begin(seg[r]), end(seg[r]), y2) -
               lower_bound(begin(seg[r]), end(seg[r]), y1);
      }
    }
    return ret;
  }
};

int c[500010];
map<int, int> pre;

signed main() {

  int n, q;
  cin >> n >> q;
  rep(i, n) cin >> c[i];

  vector<pair<int, int>> d;
  rep(i, n) {
    if (pre.count(c[i]))
      d.push_back({i, pre[c[i]]});
    pre[c[i]] = i;
  }

  RangeTree seg(d);

  while (q--) {
    int l, r;
    cin >> l >> r;
    l--;

    int ans = r - l - seg.count(l, l, r, r);
    cout << ans << endl;
  }
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define ALL(x) x.begin(), x.end()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define debug(v)                                                               \\
  cout << #v << ":";                                                           \\
  for (auto x : v) {                                                           \\
    cout << x << ' ';                                                          \\
  }                                                                            \\
  cout << endl;
#define mod 1000000007
using ll = long long;
const int INF = 1000000000;
const ll LINF = 1001002003004005006ll;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
// ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

struct IOSetup {
  IOSetup() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout << fixed << setprecision(12);
  }
} iosetup;

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  os << p.first << " " << p.second;
  return os;
}

template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  for (int i = 0; i < (int)v.size(); i++)
    os << v[i] << (i + 1 == v.size() ? "" : " ");
  return os;
}

struct RangeTree {
  // xの各値がyのソート済み配列を持つ
  vector<vector<int>> seg;
  vector<int> x;
  int sz;
  RangeTree(vector<pair<int, int>> a) {
    sz = 1;
    while ((int)a.size() > sz)
      sz <<= 1;
    sort(begin(a), end(a));
    if (a.size())
      x.push_back(a[0].first);
    for (auto &p : a)
      if (x.back() != p.first)
        x.push_back(p.first);
    while (x.size() < sz)
      x.push_back(INF);
    seg.resize(2 * sz);
    int pos = 0;
    for (auto &p : a) {
      if (x[pos] != p.first)
        pos++;
      seg[pos + sz].push_back(p.second);
    }
    for (int i = sz - 1; i > 0; i--) {
      seg[i].resize(seg[2 * i].size() + seg[2 * i + 1].size());
      merge(begin(seg[2 * i]), end(seg[2 * i]), begin(seg[2 * i + 1]),
            end(seg[2 * i + 1]), begin(seg[i]));
    }
  }
  // [x1,x2),[y1,y2)
  int count(int x1, int y1, int x2, int y2) {
    int l = lower_bound(begin(x), end(x), x1) - begin(x),
        r = lower_bound(begin(x), end(x), x2) - begin(x);
    l += sz, r += sz;
    int ret = 0;
    for (; l < r; l >>= 1, r >>= 1) {
      if (l & 1) {
        ret += lower_bound(begin(seg[l]), end(seg[l]), y2) -
               lower_bound(begin(seg[l]), end(seg[l]), y1);
        l++;
      }
      if (r & 1) {
        r--;
        ret += lower_bound(begin(seg[r]), end(seg[r]), y2) -
               lower_bound(begin(seg[r]), end(seg[r]), y1);
      }
    }
    return ret;
  }
};

int pre[500001];

signed main() {
  rep(i, 500001) pre[i] = -1;

  int n, q;
  cin >> n >> q;
  vector<int> c(n);
  rep(i, n) cin >> c[i];

  vector<pair<int, int>> d;
  rep(i, n) {
    if (pre[c[i]] >= 0)
      d.push_back({i, pre[c[i]]});
    pre[c[i]] = i;
  }

  RangeTree seg(d);

  while (q--) {
    int l, r;
    cin >> l >> r;
    l--;

    int ans = r - l - seg.count(l, l, r, r);
    cout << ans << endl;
  }
  return 0;
}