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

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

int n;
vector<pair<pair<int, int>, int>> xy;

// 素集合データ構造
//  ref:https://ei1333.github.io/luzhiled/snippets/structure/union-find.html
struct union_find {
  // parent[v]==w(>=0):vの親はw
  // parent[v]==k(<0):vは根&&vの属するグループの要素数は-k
  vector<long long int> parent;
  // コンストラクタ
  union_find(long long int n) { parent.assign(n, -1); }
  // vの根を求める
  // 求めると同時に親を根に置き換える(木の圧縮)
  long long int root(long long int v) {
    if (parent[v] < 0) {
      return v;
    } else {
      parent[v] = root(parent[v]);
      return parent[v];
    }
  }
  // vが属するグループの要素数を求める
  long long int size(long long int v) { return -parent[root(v)]; }
  // vとwを繋げる
  void unite(long long int v, long long int w) {
    v = root(v);
    w = root(w);
    if (v == w)
      return;
    if (parent[v] < parent[w])
      swap(v, w);
    parent[w] += parent[v];
    parent[v] = w;
  }
  // vとwが同値か判定
  bool isSame(long long int v, long long int w) { return root(v) == root(w); }
};

int main() {
  cin >> n;
  xy.resize(n);
  for (int i = 0; i < n; i++) {
    cin >> xy[i].first.first >> xy[i].first.second;
    xy[i].second = i;
  }
  sort(xy.begin(), xy.end());
  union_find uf(n);
  // first:y,second:index
  set<pair<int, int>> st;
  for (int i = 0; i < n; i++) {
    vector<pair<int, int>> connected;
    for (auto e : st) {
      if (e.first < xy[i].first.second) {
        uf.unite(e.second, i);
        connected.push_back(e);
      } else {
        break;
      }
    }
    if (connected.empty()) {
      st.insert({xy[i].first.second, i});
    } else {
      pair<int, int> repr = {INT_MAX, -1};
      for (auto g : connected) {
        if (repr.first > g.first) {
          repr = g;
        }
      }
      for (auto g : connected) {
        if (g != repr) {
          st.erase(g);
        }
      }
    }
  }
  vector<int> ans(n);
  for (int i = 0; i < n; i++) {
    ans[xy[i].second] = uf.size(i);
  }
  for (int i = 0; i < n; i++) {
    cout << ans[i] << endl;
  }
}

Error: TLE

Fixed submission:

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

int n;
vector<pair<pair<int, int>, int>> xy;

// 素集合データ構造
//  ref:https://ei1333.github.io/luzhiled/snippets/structure/union-find.html
struct union_find {
  // parent[v]==w(>=0):vの親はw
  // parent[v]==k(<0):vは根&&vの属するグループの要素数は-k
  vector<long long int> parent;
  // コンストラクタ
  union_find(long long int n) { parent.assign(n, -1); }
  // vの根を求める
  // 求めると同時に親を根に置き換える(木の圧縮)
  long long int root(long long int v) {
    if (parent[v] < 0) {
      return v;
    } else {
      parent[v] = root(parent[v]);
      return parent[v];
    }
  }
  // vが属するグループの要素数を求める
  long long int size(long long int v) { return -parent[root(v)]; }
  // vとwを繋げる
  void unite(long long int v, long long int w) {
    v = root(v);
    w = root(w);
    if (v == w)
      return;
    if (parent[v] < parent[w])
      swap(v, w);
    parent[w] += parent[v];
    parent[v] = w;
  }
  // vとwが同値か判定
  bool isSame(long long int v, long long int w) { return root(v) == root(w); }
};

int main() {
  cin >> n;
  xy.resize(n);
  for (int i = 0; i < n; i++) {
    cin >> xy[i].first.first >> xy[i].first.second;
    xy[i].second = i;
  }
  sort(xy.begin(), xy.end());
  union_find uf(n);
  // first:y,second:index
  set<pair<int, int>> st;
  for (int i = 0; i < n; i++) {
    vector<pair<int, int>> connected;
    for (auto e : st) {
      if (e.first < xy[i].first.second) {
        uf.unite(e.second, i);
        connected.push_back(e);
      }
    }
    if (connected.empty()) {
      st.insert({xy[i].first.second, i});
    } else {
      pair<int, int> repr = {INT_MAX, -1};
      for (auto g : connected) {
        if (repr.first > g.first) {
          repr = g;
        }
      }
      for (auto g : connected) {
        if (g != repr) {
          st.erase(g);
        }
      }
    }
  }
  vector<int> ans(n);
  for (int i = 0; i < n; i++) {
    ans[xy[i].second] = uf.size(i);
  }
  for (int i = 0; i < n; i++) {
    cout << ans[i] << endl;
  }
}