开四个set,分别存切割的刀以及每个区间段,然后每次各自从行和列取最长的区间段,乘一起即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
ll w,h;
std::set<ll> st[2];
std::multiset<ll> sm[2];
std::multiset<ll>::iterator it;
inline void init(){
char ch[5];ll x,l,r;int id;
std::cin>>ch+1;scanf("%lld",&x);
id=(ch[1]=='H');
set<ll> &nst=st[id];
multiset<ll> &nsm=sm[id];
nst.insert(x);
it=nst.find(x);
--it;l=*it;
++it,++it;r=*it;
it=nsm.find(r-l);
nsm.erase(it);nsm.insert(r-x);nsm.insert(x-l);
it=sm[0].end();--it;l=*it;
it=sm[1].end();--it;r=*it;
printf("%lld\n",l*r);
}
int main(){
scanf("%lld%lld",&w,&h);
int T;
scanf("%d",&T);
st[0].insert(0),st[0].insert(w);
st[1].insert(0),st[1].insert(h);
sm[0].insert(w),sm[1].insert(h);
while(T--){
init();
}
return 0;
}