RT
#include<bits/stdc++.h>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
#define int long long
const ll MAXN=7e5+5;
ll T;
ll n,m,q,x,y;
struct node{
pair<ll,ll> p1,p2;
ll tp;
}t[MAXN],tmp[MAXN];
ll cnt;
bool cmp_merge(node n1,node n2){
if(n1.tp!=n2.tp)return n1.tp<n2.tp;
if(n1.tp==1){
if(n1.p1.second!=n2.p1.second)return n1.p1.second<n2.p1.second;
else{
if(n1.p1.first!=n2.p1.first)return n1.p1.first<n2.p1.first;
else return n1.p2.first>n2.p2.first;
}
}
else if(n1.tp==2){
if(n1.p1.first!=n2.p1.first)return n1.p1.first<n2.p1.first;
else{
if(n1.p1.second!=n2.p1.second)return n1.p1.second<n2.p1.second;
else return n1.p2.second>n2.p2.second;
}
}
else{
if(n1.p1.first-n1.p1.second!=n2.p1.first-n2.p1.second)return n1.p1.first-n1.p1.second<n2.p1.first-n2.p1.second;
else{
if(n1.p1.first!=n2.p1.first)return n1.p1.first<n2.p1.first;
else return n1.p2.first>n2.p2.first;
}
}
}
bool cmp_y(node n1,node n2){
return n1.p1.second<n2.p1.second;
}
map<pair<ll,ll>,bool> mp_cross;
map<ll,vector<ll> > add_p,del_p;
ll len,cross;
map<ll,ll> tree;
ll lowbit(ll num){
return num&(-num);
}
void update(ll k,ll num){
while(k<=n){
tree[k]+=num;
k+=lowbit(k);
}
return;
}
ll Q(ll num){
ll ans=0;
while(num){
ans+=tree[num];
num-=lowbit(num);
}
return ans;
}
signed main(){
cin>>T;
cin>>n>>m>>q;
for(int i=1;i<=q;i++){
cin>>t[i].tp>>x>>y;
t[i].p1=make_pair(x,y);
cin>>x>>y;
t[i].p2=make_pair(x,y);
}
sort(t+1,t+1+q,cmp_merge);
// cout<<endl;
// for(int i=1;i<=q;i++)cout<<t[i].tp<<" "<<t[i].p1.first<<" "<<t[i].p1.second<<" "<<t[i].p2.first<<" "<<t[i].p2.second<<'\n';
// cout<<endl;
ll pos=2;
for(;pos<=q&&t[pos].tp==1;pos++){
if(t[pos].p1.second!=t[pos-1].p1.second)continue;
if(t[pos-1].p2.first>=t[pos].p1.first-1)t[pos].p1=t[pos-1].p1,t[pos].p2=(t[pos-1].p2.first>t[pos].p2.first?t[pos-1].p2:t[pos].p2),t[pos-1].tp=0;
}
pos++;
for(;pos<=q&&t[pos].tp==2;pos++){
if(t[pos].p1.first!=t[pos-1].p1.first)continue;
if(t[pos-1].p2.second>=t[pos].p1.second-1)t[pos].p1=t[pos-1].p1,t[pos].p2=(t[pos-1].p2.second>t[pos].p2.second?t[pos-1].p2:t[pos].p2),t[pos-1].tp=0;
}
pos++;
for(;pos<=q&&t[pos].tp==3;pos++){
if(t[pos].p1.first-t[pos].p1.second!=t[pos-1].p1.first-t[pos-1].p1.second)continue;
if(t[pos-1].p2.first>=t[pos].p1.first-1)t[pos].p1=t[pos-1].p1,t[pos].p2=(t[pos-1].p2.first>t[pos].p2.first?t[pos-1].p2:t[pos].p2),t[pos-1].tp=0;
}
for(int i=1;i<=q;i++)if(t[i].tp)tmp[++cnt]=t[i];
//debug
// for(int i=1;i<=cnt;i++)cout<<tmp[i].tp<<" "<<tmp[i].p1.first<<" "<<tmp[i].p1.second<<" "<<tmp[i].p2.first<<" "<<tmp[i].p2.second<<'\n';
//debug
pos=cnt;
for(;pos>=1&&tmp[pos].tp==3;pos--){
for(int i=1;i<=cnt&&tmp[i].tp!=3;i++){
if(tmp[i].tp==1){
if(tmp[i].p1.second<min(tmp[pos].p1.second,tmp[pos].p2.second)||tmp[i].p1.second>max(tmp[pos].p1.second,tmp[pos].p2.second))continue;
if(tmp[pos].p1.second<=tmp[pos].p2.second){
ll delta=tmp[i].p1.second-tmp[pos].p1.second;
ll p_x=tmp[pos].p1.first+delta;
if(p_x>=tmp[i].p1.first&&p_x<=tmp[i].p2.first){
if(!mp_cross[make_pair(p_x,tmp[i].p1.second)])mp_cross[make_pair(p_x,tmp[i].p1.second)]=1;
}
}
else{
ll delta=tmp[i].p1.second-tmp[pos].p1.second;
delta=-delta;
ll p_x=tmp[pos].p1.first+delta;
if(p_x>=tmp[i].p1.first&&p_x<=tmp[i].p2.first){
if(!mp_cross[make_pair(p_x,tmp[i].p1.second)])mp_cross[make_pair(p_x,tmp[i].p1.second)]=1;
}
}
}
else{
if(tmp[i].p1.first<min(tmp[pos].p1.first,tmp[pos].p2.first)||tmp[i].p1.first>max(tmp[pos].p1.first,tmp[pos].p2.first))continue;
if(tmp[pos].p1.second<=tmp[pos].p2.second){
ll delta=tmp[i].p1.first-tmp[pos].p1.first;
ll p_y=tmp[pos].p1.second+delta;
if(p_y>=tmp[i].p1.second&&p_y<=tmp[i].p2.second)mp_cross[make_pair(tmp[i].p1.first,p_y)]=1;
}
else{
ll delta=tmp[i].p1.first-tmp[pos].p1.first;
delta=-delta;
ll p_y=tmp[pos].p1.second+delta;
if(p_y>=tmp[i].p1.second&&p_y<=tmp[i].p2.second)mp_cross[make_pair(tmp[i].p1.first,p_y)]=1;
}
}
}
}
for(int i=1;i<=cnt;i++){
if(tmp[i].tp&1)len+=tmp[i].p2.first-tmp[i].p1.first+1;
else len+=tmp[i].p2.second-tmp[i].p1.second+1;
}
len-=mp_cross.size();
// cout<<"len: "<<len<<endl;
for(;pos>=1&&tmp[pos].tp==2;pos--){
add_p[tmp[pos].p1.second].push_back(tmp[pos].p1.first);
del_p[tmp[pos].p2.second+1].push_back(tmp[pos].p1.first);
}
// cout<<"pos: "<<pos<<endl;
for(int i=1,j;i<=pos;i=j+1){
j=i;
while(j<=pos&&tmp[j].p1.second==tmp[i].p1.second)j++;
j--;
for(ll x:add_p[tmp[i].p1.second])update(x,1);
for(ll x:del_p[tmp[i].p1.second])update(x,-1);
for(int k=i;k<=j;k++)cross+=Q(tmp[k].p2.first)-Q(tmp[k].p1.first-1);
}
// cout<<"len: "<<len<<endl;
// cout<<"cross: "<<cross<<endl;
cout<<len-cross;
return 0;
}