#include <bits/stdc++.h>
using namespace std;
inline int nxt() {
  int first;
  scanf("%d", &first);
  return first;
}
struct Fenwick {
  int n;
  vector<int> a;
  Fenwick(int n = 0) : n(n) { a.resize(n); }
  void add(int pos, int first) {
    while (pos < n) {
      a[pos] += first;
      pos = (pos | (pos + 1));
    }
  }
  int get(int pos) {
    int res = 0;
    while (pos >= 0) {
      res += a[pos];
      pos = (pos & (pos + 1)) - 1;
    }
    return res;
  }
};
int main() {
  int n = nxt();
  vector<int> values;
  vector<int> a(n), t(n), first(n);
  for (int i = 0; i < n; i++) {
    a[i] = nxt();
    t[i] = nxt();
    first[i] = nxt();
    values.push_back(first[i]);
  }
  sort((values).begin(), (values).end());
  values.resize(unique((values).begin(), (values).end()) - values.begin());
  int sz = values.size();
  vector<int> cnt(sz);
  for (int i = 0; i < n; i++) {
    cnt[lower_bound((values).begin(), (values).end(), first[i]) -
        values.begin()]++;
  }
  vector<vector<int>> moms(sz);
  for (int i = 0; i < n; i++) {
    first[i] = lower_bound((values).begin(), (values).end(), first[i]) -
               values.begin();
    moms[first[i]].push_back(t[i]);
  }
  for (int i = 0; i < sz; i++) {
    sort((moms[i]).begin(), (moms[i]).end());
  }
  vector<Fenwick> fenv;
  for (int i = 0; i < sz; i++) {
    fenv.emplace_back(cnt[i]);
  }
  for (int i = 0; i < n; i++) {
    if (a[i] == 1) {
      int tt =
          lower_bound((moms[first[i]]).begin(), (moms[first[i]]).end(), t[i]) -
          moms[first[i]].begin();
      fenv[first[i]].add(tt, 1);
    } else if (a[i] == 2) {
      int tt =
          lower_bound((moms[first[i]]).begin(), (moms[first[i]]).end(), t[i]) -
          moms[first[i]].begin();
      fenv[first[i]].add(tt, -1);
    } else {
      int tt =
          lower_bound((moms[first[i]]).begin(), (moms[first[i]]).end(), t[i]) -
          moms[first[i]].begin();
      printf("%d\n", fenv[first[i]].get(tt));
    }
  }
  return 0;
}
