// Problem: C - Many Segments
// Contest: AtCoder - AtCoder Beginner Contest 207
// URL: https://atcoder.jp/contests/abc207/tasks/abc207_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define int long long
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
#define vi vector<int>
#define vstr vector<string>
#define vdb vector<double>
#define vbool vector<bool>
#define vvi vector<vector<int> >
#define mii map<int,int>
#define pb push_back
#define pii pair<int,int>
#define vpair vector<pii > 
#define mkp make_pair
#define scan(a,n) for(int i =0 ; i<n ; i++) cin>>a[i]
#define print(a,n) for(int i = 0 ; i < n ; i++) {cout<<a[i]<<' ';}cout<<'\n'
#define mem(a,v) memset(a,v,sizeof(a))
#define loop(i,a,b) for (int i = a; i < b; i++)
#define loope(i,a,b) for (int i = a; i <= b; i++)
#define bloop(i,a,b) for(int i = a;i>=b;i--)
#define FastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define PRECISION std::cout.unsetf ( std::ios::fixed );std::cout.precision(9)
#define PI 3.14159265
#define S second
#define F first
#define CHECK cout<<"CHEDEDWB"<<endl
#define CHECK1(a) cout<<a<<endl
#define CHECK2(a,b) cout<<a<<' '<<b<<endl;
#define br '\n'
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(),x.end()
using namespace std;
int mod = 1e9+7;
int inf = 1e18;
int m_inf = INT_MIN;
// int extendedgcd(int a,int b,int &x,int &y){
	// if(a == 0){
		// x = 0; y = 1;
		// return b;
	// }
	// int x1,y1;
	// int d = extendedgcd(b%a,a,x1,y1);
	// x = y1 - (b/a)*x1;y = x1;
	// return d;
// }
// int expmod(int a,int b) {
// 	if(b == 1) return a;
// 	if(b == 0) return 1;
// 	int m1 = expmod(a,b/2)%mod;
// 	if(b%2) return ((m1*m1)%mod*a%mod)%mod;
// 	return (m1*m1)%mod;
// }
// int power(int a,int b) {
// 	if(b == 1) return a;
// 	if(b == 0) return 1;
// 	int m1 = power(a,b/2);
// 	if(b%2) return m1*m1*a;
// 	return m1*m1;
// }
// int logn(int n, int r) 
// { 
//     return (n > r - 1) ? 1 + logn(n / r, r) : 0; 
// } 

// int nCr(int n,int r)
// {
	// r = min(r,n-r);
	// if(r<0)
		// return 0;
	// if(r == 0)
		// return 1;
	// int ans = 1;
	// for(int i = 1;i<=r;i++)
	// {
		// ans = ans*(n-i+1)/i;
	// }
	// return ans;
// 		
// }
// vi factmod(int n)
// {
	// vi ans(n+1);
	// ans[0] = 1;
	// loop(i,1,n+1)
	// {
		// ans[i] = (ans[i-1]*i)%mod;
	// }
	// return ans;
// }
// int nCrmod(int n,int r,vi &fact)
// {
	// int x1,y1;
	// extendedgcd(fact[r],mod,x1,y1);
	// int x2,y2;
	// extendedgcd(fact[n-r],mod,x2,y2);
	// int ans = (fact[n]*((x1+mod)%mod))%mod;
	// ans = (ans*((x2+mod)%mod))%mod;
	// return ans;
// }

// void dfs(vector<vector<int> > &adj,int root,vbool &vis)
// {
// 	vis[root] = true;
// 	for(int i = 0;i<adj[root].size();i++){
// 		int v = adj[root][i];
// 		if(!vis[v])		
// 			dfs(adj,v,vis);
// 	}
// }
void solve()
{
	int n;
	cin>>n;
	vvi arr(n,vi(3));
	loop(i,0,n)
	{
		cin>>arr[i][0]>>arr[i][1]>>arr[i][2];
	}
	int ans = 0;
	for(int i = 0;i<n;i++)
	{
		for(int j = i+1;j<n;j++)
		{
			vi a = arr[i];
			vi b = arr[j];
			if(a[1]>b[1])
			{
				swap(a,b);
			}
			// print(a,3);
			// print(b,3);
			if(a[2]>b[1] || a[1] == b[1])
				ans++;
			else if(a[2] == b[1] && (a[0] == 1 || a[0] == 3) && (b[0] == 1 || b[0] == 2))
				ans++;
			// cout<<ans<<'\n';
			
		}
	}
	cout<<ans<<'\n';
}
int32_t main() 
{
	FastIO; PRECISION;
	int t = 1;
	// cin>>t;
	while(t--)
	{
		solve();
	}
}
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;
using lint=long long;

template<class G>
class Fenwick_tree{
	vector<G> a;
public:
	Fenwick_tree(){}
	Fenwick_tree(int n){ build(n); }
	Fenwick_tree(const vector<G>& a){ build(a); }
	void build(int n){
		a.assign(n,G{});
	}
	void build(const vector<G>& a){
		this->a=a;
		for(int i=1;i<a.size();i++) if(i+(i&-i)-1<a.size()) (this->a)[i+(i&-i)-1]+=(this->a)[i-1];
	}
	void add(int i,const G& val){
		for(i++;i<=a.size();i+=i&-i) a[i-1]+=val;
	}
	G sum(int l,int r)const{
		if(l==0){
			G res{};
			for(;r>0;r-=r&-r) res+=a[r-1];
			return res;
		}
		return sum(0,r)-sum(0,l);
	}
	int lower_bound(G val)const{
		if(val<=G{}) return 0;
		int x=0,k;
		for(k=1;k<=a.size();k<<=1);
		for(k>>=1;k>0;k>>=1) if(x+k<=a.size() && a[x+k-1]<val) val-=a[x+k-1], x+=k;
		return x;
	}
	int upper_bound(G val)const{
		if(val<G{}) return 0;
		int x=0,k;
		for(k=1;k<=a.size();k<<=1);
		for(k>>=1;k>0;k>>=1) if(x+k<=a.size() && a[x+k-1]<=val) val-=a[x+k-1], x+=k;
		return x;
	}
};

int main(){
	int h,w,q; scanf("%d%d%d",&h,&w,&q);
	vector<int> type(q),p(q);
	vector<lint> val(q);
	rep(i,q) scanf("%d%d%lld",&type[i],&p[i],&val[i]), p[i]--;

	vector<int> idx(q);
	{
		vector<pair<lint,int>> P(q+1);
		rep(i,q) P[i]={val[i],i};
		P[q]={0,-1};
		sort(P.begin(),P.end());
		rep(i,q+1) if(P[i].second!=-1) idx[P[i].second]=i;
	}

	Fenwick_tree<lint> Frow_cnt(q+1),Frow_sum(q+1);
	Fenwick_tree<lint> Fcol_cnt(q+1),Fcol_sum(q+1);
	Frow_cnt.add(0,h);
	Fcol_cnt.add(0,w);

	lint sum=0;
	vector<int> pre_row(h,0),pre_col(w,0);
	rep(i,q){
		if(type[i]==1){
			int pre=pre_row[p[i]];
			int val_pre=Frow_sum.sum(pre,pre+1);

			sum-=val_pre*Fcol_cnt.sum(0,pre)-Fcol_sum.sum(0,pre);
			sum+=val[i]*Fcol_cnt.sum(0,idx[i])-Fcol_sum.sum(0,idx[i]);

			Frow_cnt.add(idx[i],1);
			Frow_sum.add(idx[i],val[i]);
			if(pre!=-1){
				Frow_cnt.add(pre,-1);
				Frow_sum.add(pre,-val_pre);
			}
			pre_row[p[i]]=idx[i];
		}
		else{
			int pre=pre_col[p[i]];
			int val_pre=Fcol_sum.sum(pre,pre+1);

			sum-=val_pre*Frow_cnt.sum(0,pre)-Frow_sum.sum(0,pre);
			sum+=val[i]*Frow_cnt.sum(0,idx[i])-Frow_sum.sum(0,idx[i]);

			Fcol_cnt.add(idx[i],1);
			Fcol_sum.add(idx[i],val[i]);
			if(pre!=-1){
				Fcol_cnt.add(pre,-1);
				Fcol_sum.add(pre,-val_pre);
			}
			pre_col[p[i]]=idx[i];
		}
		printf("%lld\n",sum);
	}

	return 0;
}
