#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
int q, a, t, x, BIT[N + 1], ans[N], Q;
set<int> num;
vector<int> times;
map<int, int> m;
unordered_map<int, vector<pair<pair<int, int>, int> > > v;
void add(int i, int v) {
  while (i <= N) {
    BIT[i] += v;
    i += (i & -i);
  }
}
int get(int i) {
  int res = 0;
  while (i > 0) {
    res += BIT[i];
    i -= (i & -i);
  }
  return res;
}
int main() {
  scanf("%d", &q);
  Q = 0;
  for (int i = 0; i < q; i++) {
    scanf("%d%d%d", &a, &t, &x);
    times.push_back(t);
    num.insert(x);
    v[x].push_back(make_pair(make_pair(a, t), Q));
    if (a == 3) Q++;
  }
  sort(times.begin(), times.end());
  for (int i = 0; i < times.size(); i++) m[times[i]] = i + 1;
  for (set<int>::iterator it = num.begin(); it != num.end(); it++) {
    memset(BIT, 0, sizeof(BIT));
    vector<pair<pair<int, int>, int> > v2;
    v2 = v[*it];
    for (int i = 0; i < v2.size(); i++) {
      if (v2[i].first.first == 1) {
        add(m[v2[i].first.second], 1);
      } else if (v2[i].first.first == 2) {
        add(m[v2[i].first.second], -1);
      } else {
        ans[v2[i].second] = get(m[v2[i].first.second]);
      }
    }
  }
  for (int i = 0; i < Q; i++) {
    printf("%d\n", ans[i]);
  }
  return 0;
}
