#include<bits/stdc++.h>
#define ll long long
using namespace std;
const long long N=2e6+6;
ll a[N],b[N];
long long n,m,q,ans;
struct segment {
	long long siz[N<<2],sum[N],ls[N<<2],rs[N<<2],cnt=0,root=0;
	void change(ll l,ll r,ll &p,ll x,ll k) {
		if(!p) p=++cnt;
		if(l==r) {
			sum[p]+=k*x;
			siz[p]+=k;
			return;
		}
		ll mid=(l+r)>>1;
		if(x<=mid) change(l,mid,ls[p],x,k);
		else change(mid+1,r,rs[p],x,k);
		sum[p]=sum[ls[p]]+sum[rs[p]];
		siz[p]=siz[ls[p]]+siz[rs[p]];
	}
	ll query1(ll l,ll r,ll p,ll x) {
		if(!p) return 0;
		if(r<=x) return siz[p];
		ll mid=(l+r)>>1;
		if(x<=mid) return query1(l,mid,ls[p],x);
		else return siz[ls[p]]+query1(mid+1,r,rs[p],x);
	}
	ll query2(ll l,ll r,ll p,ll x) {
		if(!p) return 0;
		if(l>x) return sum[p];
		ll mid=(l+r)>>1;
		if(x<=mid) return sum[rs[p]]+query2(l,mid,ls[p],x);
		else return query2(mid+1,r,rs[p],x);
	}
} A,B;
signed main() {
	scanf("%lld %lld %lld",&n,&m,&q);
	A.change(0,1e8,A.root,0,n),B.change(0,1e8,B.root,0,m);
	for(long long i=1;i<=q;i++) {
		long long opt,t,x,y;
		cin>>opt>>x>>y;
		if(opt==1) {
			ans=ans-B.query1(0,1e8,B.root,a[x])*a[x]-B.query2(0,1e8,B.root,a[x]);
			A.change(0,1e8,A.root,a[x],-1);
			A.change(0,1e8,A.root,y,1);
			a[x]=y;
			ans+=B.query1(0,1e8,B.root,y)*y+B.query2(0,1e8,B.root,y);
		}
		else {
			ans=ans-A.query1(0,1e8,A.root,b[x])*b[x]-A.query2(0,1e8,A.root,b[x]);
			B.change(0,1e8,B.root,b[x],-1);
			B.change(0,1e8,B.root,y,1);
			b[x]=y;
			ans+=A.query1(0,1e8,A.root,y)*y+A.query2(0,1e8,A.root,y);
		}
		cout<<ans<<endl;
	}
	return 0;
}
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int P=1e9+7,N=4e5+5;
int A[N],B[N],b[N],T[N],X[N],Y[N],ans,len;
struct BIT{
	int t[N],sum;
	void add(int i,int k) {
		sum+=k;
		for(;i<=len;i+=(i&-i))t[i]+=k;
	}
	int qry(int i) {
		int res=0;
		for(;i>0;i-=(i&-i))res+=t[i];
		return res;
	}
}T1,T2,t1,t2;
int read() {
	int x=0,f=1;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
main() {
	int n=read(),m=read(),Q=read();
	for(int i=1;i<=n;++i)A[i]=0;
	for(int i=1;i<=m;++i)B[i]=0;
	b[len=1]=0;
	for(int i=1;i<=Q;++i) {
		T[i]=read();
		X[i]=read();
		b[++len]=Y[i]=read();
	}
	sort(b+1,b+len+1);
	len=unique(b+1,b+len+1)-b-1;
	for(int i=1;i<=n;++i) {
		A[i]=1;
		T1.add(A[i],b[A[i]]);
		t1.add(A[i],1);
	}
	for(int i=1;i<=m;++i) {
		B[i]=1;
		T2.add(B[i],b[B[i]]);
		t2.add(B[i],1);
	}
	for(int i=1;i<=Q;++i) {
		Y[i]=lower_bound(b+1,b+len+1,Y[i])-b;
		if(T[i]==1) {
			int p=X[i];
			ans-=b[A[p]]*t2.qry(A[p]);
			ans-=(T2.sum-T2.qry(A[p]));
			t1.add(A[p],-1);T1.add(A[p],-b[A[p]]);
			A[p]=Y[i];
			ans+=b[A[p]]*t2.qry(A[p]);
			ans+=(T2.sum-T2.qry(A[p]));
			t1.add(A[p],1);T1.add(A[p],b[A[p]]);
		}
		else {
			int p=X[i];
			ans-=b[B[p]]*t1.qry(B[p]);
			ans-=(T1.sum-T1.qry(B[p]));
			t2.add(B[p],-1);T2.add(B[p],-b[B[p]]);
			B[p]=Y[i];
			ans+=b[B[p]]*t1.qry(B[p]);
			ans+=(T1.sum-T1.qry(B[p]));
			t2.add(B[p],1);T2.add(B[p],b[B[p]]);
		}
		printf("%lld\n",ans);
	}
	return 0;
}