#include <bits/stdc++.h>
#pragma comment(linker, "/stack:16777216")
using namespace std;
const int INF = 1000000000;
const int MAX = 2000000;
const int MAX2 = 3500000;
const int BASE = 1000000000;
const int CNT = 20000;
struct RMQ {
  int n;
  int T[MAX * 4];
  RMQ() {}
  void init(int len) {
    n = len;
    for (int i = (0); i < (n * 4); ++i) T[i] = 0;
  }
  void add(int j, int d, int i, int l, int r) {
    if (l == r)
      T[i] += d;
    else {
      int m = (l + r) / 2;
      if (j <= m)
        add(j, d, i * 2, l, m);
      else
        add(j, d, i * 2 + 1, m + 1, r);
      T[i] = T[i * 2] + T[i * 2 + 1];
    }
  }
  int get(int l, int r, int i, int tl, int tr) {
    if (l == tl && r == tr) return T[i];
    int m = (tl + tr) / 2;
    if (r <= m) return get(l, r, i * 2, tl, m);
    if (l > m) return get(l, r, i * 2 + 1, m + 1, tr);
    int a = get(l, m, i * 2, tl, m);
    int b = get(m + 1, r, i * 2 + 1, m + 1, tr);
    return a + b;
  }
};
struct node {
  int id;
  int a, t, x;
  node() {}
};
int n;
node Q[MAX];
vector<int> I[MAX];
int R[MAX];
vector<int> X;
vector<int> T;
RMQ D;
int main() {
  cin >> n;
  for (int i = (0); i < (n); ++i) {
    int a, t, x;
    scanf("%d %d %d", &a, &t, &x);
    Q[i].a = a;
    Q[i].t = t;
    Q[i].x = x;
    X.push_back(x);
    T.push_back(t);
  }
  sort(X.begin(), X.end());
  sort(T.begin(), T.end());
  for (int i = (0); i < (n); ++i)
    Q[i].x = lower_bound(X.begin(), X.end(), Q[i].x) - X.begin();
  for (int i = (0); i < (n); ++i)
    Q[i].t = lower_bound(T.begin(), T.end(), Q[i].t) - T.begin();
  for (int i = (0); i < (n); ++i) I[Q[i].x].push_back(i);
  D.init((int)T.size());
  for (int i = (0); i < ((int)X.size()); ++i) {
    for (int j = (0); j < ((int)I[i].size()); ++j) {
      int id = I[i][j];
      if (Q[id].a == 1) {
        D.add(Q[id].t, 1, 1, 0, D.n - 1);
      } else if (Q[id].a == 2) {
        D.add(Q[id].t, -1, 1, 0, D.n - 1);
      } else {
        int sum = D.get(0, Q[id].t, 1, 0, D.n - 1);
        R[id] = sum;
      }
    }
    for (int j = (0); j < ((int)I[i].size()); ++j) {
      int id = I[i][j];
      if (Q[id].a == 1) {
        D.add(Q[id].t, -1, 1, 0, D.n - 1);
      } else if (Q[id].a == 2) {
        D.add(Q[id].t, 1, 1, 0, D.n - 1);
      }
    }
  }
  for (int i = (0); i < (n); ++i)
    if (Q[i].a == 3) printf("%d\n", R[i]);
  return 0;
}
