#include <bits/stdc++.h>
using namespace std;
inline long long int modadd(long long int n, long long int m,
                            long long int p = 1000000007) {
  return ((n + m) % p + p) % p;
}
inline long long int modsub(long long int n, long long int m,
                            long long int p = 1000000007) {
  return ((n - m + p) % p + p) % p;
}
inline long long int modpro(long long int n, long long int m,
                            long long int p = 1000000007) {
  return (((n % p) * (m % p)) % p + p) % p;
}
unsigned long long int powe(long long int first, long long int second) {
  unsigned long long int res = 1;
  while (second > 0) {
    if (second & 1) res = res * first;
    second = second >> 1;
    first = first * first;
  }
  return res;
}
long long int modpow(long long int first, long long int second,
                     long long int p = 1000000007) {
  long long int res = 1;
  while (second > 0) {
    if (second & 1) res = modpro(res, first, p);
    second = second >> 1;
    first = modpro(first, first, p);
  }
  return res;
}
inline long long int modInverse(long long int n, long long int p = 1000000007) {
  if (n == 1) return 1;
  return modpow(n, p - 2, p);
}
inline long long int moddiv(long long int n, long long int m,
                            long long int p = 1000000007) {
  return modpro(n, modInverse(m, p), p);
}
inline long long int modadd3(long long int first, long long int second,
                             long long int z, long long int p = 1000000007) {
  return modadd(modadd(first, second, p), z, p);
}
inline long long int modadd4(long long int first, long long int second,
                             long long int z, long long int w,
                             long long int p = 1000000007) {
  return modadd(modadd(first, second, p), modadd(z, w, p), p);
}
inline long long int modnCr(long long int fac[], int n, int r,
                            long long int p = 1000000007) {
  if (r == 0) return 1;
  return modpro(fac[n], modInverse(modpro(fac[r], fac[n - r], p), p), p);
}
template <typename T>
inline T max3(T first, T second, T z) {
  return max(max(first, second), z);
}
template <typename T>
inline T max4(T first, T second, T z, T w) {
  return max(max3(first, second, w), z);
}
template <typename T>
inline T min3(T first, T second, T z) {
  return min(min(first, second), z);
}
template <typename T>
inline T min4(T first, T second, T z, T w) {
  return min(min3(first, second, w), z);
}
template <typename T>
void printArr(T *arr, int s, int n) {
  for (int i = s; i <= n; i++) {
    cout << arr[i] << " ";
  }
  cout << endl;
}
struct FenwickTree {
  vector<int> bit;
  int n;
  FenwickTree(int n) {
    this->n = n;
    bit.assign(n, 0);
  }
  int sum(int r) {
    int ret = 0;
    for (; r >= 0; r = (r & (r + 1)) - 1) ret += bit[r];
    return ret;
  }
  void add(int idx, int delta) {
    for (; idx < n; idx = idx | (idx + 1)) bit[idx] += delta;
  }
};
int ans[100005];
pair<pair<int, int>, pair<int, int>> p[100005];
int sd[100005];
vector<pair<pair<int, int>, int>> qps[100005];
map<int, int> m;
int main() {
  std::ios::sync_with_stdio(false);
  cin.tie(NULL);
  int erer = 1;
  for (int erer2 = (1); erer2 < (erer + 1); erer2++) {
    int n;
    cin >> n;
    memset(ans, -1, sizeof(ans));
    for (int i = (0); i < (n); i++) {
      cin >> p[i].second.first >> p[i].first.first >> p[i].second.second;
      p[i].first.second = i;
      sd[i] = p[i].second.second;
    }
    sort(sd, sd + n);
    int nou = unique(sd, sd + n) - sd;
    for (int i = (0); i < (n); i++) {
      int pos = lower_bound(sd, sd + nou, p[i].second.second) - sd;
      qps[pos].push_back({{p[i].first.first, p[i].second.first}, i});
    }
    for (int i = (0); i < (nou); i++) {
      for (int j = 0; j < ((long long int)(qps[i]).size()); j++) {
        sd[j] = qps[i][j].first.first;
      }
      sort(sd, sd + ((long long int)(qps[i]).size()));
      for (int j = (0); j < (((long long int)(qps[i]).size())); j++) {
        int pos = lower_bound(sd, sd + ((long long int)(qps[i]).size()),
                              qps[i][j].first.first) -
                  sd;
        qps[i][j].first.first = pos;
      }
      FenwickTree ft(((long long int)(qps[i]).size()));
      for (int j = (0); j < (((long long int)(qps[i]).size())); j++) {
        if (qps[i][j].first.second == 1)
          ft.add(qps[i][j].first.first, 1);
        else if (qps[i][j].first.second == 2)
          ft.add(qps[i][j].first.first, -1);
        else
          ans[qps[i][j].second] = ft.sum(qps[i][j].first.first);
      }
    }
    for (int i = (0); i < (n); i++)
      if (ans[i] != -1) cout << ans[i] << "\n";
  }
  return 0;
}
