#include <bits/stdc++.h>
#define R(x) x = read()
#define int long long
#define double long double
#define pii pair<int,int>
#define iax INT_MAX
#define iin INT_MIN
#define lax LLONG_MAX
#define lin LLONG_MIN
#define sqrt sqrtl
bool Mbe;
using namespace std;
char pbuf[1<<20], *pp=pbuf;
inline void push(const char &c){(pp-pbuf==1<<20)?fwrite(pbuf,1,1<<20,stdout),pp=pbuf,*pp++=c:*pp++=c;}
class io {public:~io() {fwrite(pbuf, 1, pp - pbuf, stdout);}} _;
inline void write(int x) {
x<0&&(push('-'),x=-x);
static int sta[60]={},top=0;
do{sta[top++]=x%10,x/=10;}while(x);
while(top)push(sta[--top]^'0');
}
#ifndef LOCAL
char buf[1<<23],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
inline int read() {
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){ch=='-'&&(f=-1);ch=getchar();}
while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
return x*f;
}
int c;
constexpr int N=1e5+100;
int n,m,q;
struct line{
int x1,x2,y,tp;
}e[N<<1];
pair<pii,int>h[N];
pair<int,pii>d[N];
int lh,ld;
int l;
pair<pii,pii> p[6];
int a[N<<2];
struct node{
int ls,rs,s,len;
}t[N<<2];
int siz=1;
void build(int i,int l,int r){
if(l^r){
int mid=(l+r)>>1;t[i].ls=++siz;
build(siz,l,mid);t[i].rs=++siz;
build(siz,mid+1,r);
}
}
void add(int i,int l,int r,int ll,int rr,int k){
if(ll<=l&&r<=rr){
t[i].s+=k*(r-l+1);
}else{
int mid=(l+r)>>1;
if(ll<=mid)add(t[i].ls,l,mid,ll,rr,k);
if(rr>mid) add(t[i].rs,mid+1,r,ll,rr,k);
}
if(t[i].s){
// cerr << i << ' ' << l << ' ' << r << '\n';
t[i].len=a[r+1]-a[l];
}else t[i].len=t[t[i].ls].len+t[t[i].rs].len;
// cerr << ':' << l << ' ' << r << ' ' << t[i].len << ' ' << t[i].s << '\n';
}
int f(pair<pii,pii> a){
return a.first.first-a.first.second;
}
bool Med;
signed main(){
#ifndef LOCAL
#else
cerr << (&Med-&Mbe)/1024.0/1024 << "MB\n";
#endif
R(c);
R(n);R(m);R(q);
m=n=0;
for(int i=1;i<=q;i++){
int R(t),R(x1),R(y1),R(x2),R(y2);
a[++n]=x1;
a[++n]=x2;
a[++n]=x1+1;
a[++n]=x2+1;
if(t<=2)e[++m]={x1,x2,y1,1},e[++m]={x1,x2,y2+1,-1};
else p[++l]={{x1,y1},{x2,y2}};
if(t==1)h[++lh]={{x1,x2},y1};
if(t==2)d[++ld]={x1,{y1,y2}};
}
sort(a+1,a+1+n);
n=unique(a+1,a+1+n)-a-1;
for(int i=1;i<=m;i++){
e[i].x1=lower_bound(a+1,a+1+n,e[i].x1)-a;
e[i].x2=lower_bound(a+1,a+1+n,e[i].x2)-a;
}
int ans=0;
sort(e+1,e+1+m,[](line x,line y){return x.y<y.y;});
build(1,1,n);
for(int i=1;i<=m;i++){
ans+=t[1].len*(e[i].y-e[i-1].y);
// cerr << e[i].y-e[i-1].y << ' ' << t[1].len << ' ' << e[i].x1 << ' ' << e[i].x2 << ' ' << '\n';
add(1,1,n,e[i].x1,e[i].x2,e[i].tp);
}
set<pii> s;
for(int _=1;_<=l;_++){
pii p1,p2;
tie(p1,p2)=p[_];
int x1,x2,y1,y2;
tie(x1,y1)=p1;
tie(x2,y2)=p2;
ans+=x2-x1+1;
for(int i=1;i<=lh;i++){
int l,r;
tie(l,r)=h[i].first;
int y=h[i].second;
if(y1<=y&&y<=y2){
int del=y-y1;
int x=x1+del;
if(l<=x&&x<=r&&x1<=x&&x<=x2){
s.emplace(x,y);
}
}
}
for(int i=1;i<=ld;i++){
int l,r;
tie(l,r)=d[i].second;
int x=d[i].first;
if(x1<=x&&x<=x2){
int del=x-x1;
int y=y1+del;
if(l<=y&&y<=r&&y1<=y&&y<=y2){
s.emplace(x,y);
}
}
}
}
ans-=s.size();
write(ans);
return 0;
}
答案偏大,可能是斜线和横竖线的交点有遗漏