#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <algorithm>
#define lson x<<1
#define rson x<<1|1
#define mp(A,B) make_pair(A,B)
using namespace std;
const int maxn=100010;
typedef long long ll;
typedef pair<int,int> pii;
int C,n,m,M[2],A,B;
ll ans;
int ref[maxn<<2];
struct node
{
int a[2],b[2],vis,val;
}p[maxn];
struct number
{
int val,org,k;
}num[maxn<<2];
priority_queue<pii> pq;
struct heap
{
priority_queue<pii> p1,p2;
inline void push(pii x) {p1.push(x);}
inline void erase(pii x) {p2.push(x);}
inline int size() {return p1.size()-p2.size();}
inline pii top()
{
while(p2.size()&&p1.top()==p2.top()) p1.pop(),p2.pop();
return p1.size()?p1.top():mp(0,0);
}
};
struct sag
{
pii s[maxn<<4];
int f[maxn<<2];
heap q[maxn<<2];
int find(int x)
{
return (f[x]==x)?x:(f[x]=find(f[x]));
}
void build(int l,int r,int x)
{
if(l==r)
{
s[x]=q[l].top();
return ;
}
int mid=(l+r)>>1;
build(l,mid,lson),build(mid+1,r,rson);
s[x]=max(s[lson],s[rson]);
}
pii query(int l,int r,int x,int a,int b)
{
if(a<=l&&r<=b) return s[x];
int mid=(l+r)>>1;
if(b<=mid) return query(l,mid,lson,a,b);
if(a>mid) return query(mid+1,r,rson,a,b);
return max(query(l,mid,lson,a,b),query(mid+1,r,rson,a,b));
}
void del(int l,int r,int x,int a,pii b)
{
if(l==r)
{
q[l].erase(b);
s[x]=q[l].top();
return ;
}
int mid=(l+r)>>1;
if(a<=mid) del(l,mid,lson,a,b);
else del(mid+1,r,rson,a,b);
s[x]=max(s[lson],s[rson]);
}
}s[2];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<‘0‘||gc>‘9‘) {if(gc==‘-‘) f=-f; gc=getchar();}
while(gc>=‘0‘&&gc<=‘9‘) ret=ret*10+gc-‘0‘,gc=getchar();
return ret*f;
}
inline void insert(int y,int x)
{
//printf("*%d %d\n",y,x);
if(!y) A--;
else B--;
s[y].f[x]=s[y].find(x+1);
while(1)
{
int t=s[y].query(1,M[y],1,1,x).second;
if(p[t].b[y]<x) return ;
s[0].del(1,M[0],1,p[t].a[0],mp(p[t].b[0],t)),s[1].del(1,M[1],1,p[t].a[1],mp(p[t].b[1],t));
pq.push(mp(p[t].val,t));
}
}
bool cmp1(number a,number b)
{
return a.val<b.val;
}
bool cmp2(node a,node b)
{
return a.val>b.val;
}
int main()
{
//freopen("bz4388.in","r",stdin);
A=rd(),B=rd(),rd(),n=rd();
int i,j,u;
for(i=1;i<=n;i++)
{
num[i].val=rd(),num[i+n].val=rd()+1,num[i+2*n].val=rd(),num[i+3*n].val=rd()+1,p[i].val=rd();
num[i].org=num[i+n].org=num[i+2*n].org=num[i+3*n].org=i;
num[i].k=0,num[i+n].k=1,num[i+2*n].k=2,num[i+3*n].k=3;
}
sort(num+1,num+4*n+1,cmp1);
for(i=1;i<=4*n;i++)
{
if(num[i].val>num[i-1].val) ref[++m]=num[i].val;
if(num[i].k==0) p[num[i].org].a[0]=m;
if(num[i].k==1) p[num[i].org].b[0]=m-1,M[0]=m-1;
if(num[i].k==2) p[num[i].org].a[1]=m;
if(num[i].k==3) p[num[i].org].b[1]=m-1,M[1]=m-1;
}
for(i=1;i<=n;i++) s[0].q[p[i].a[0]].push(mp(p[i].b[0],i)),s[1].q[p[i].a[1]].push(mp(p[i].b[1],i));
s[0].build(1,M[0],1),s[1].build(1,M[1],1);
for(i=1;i<=M[0]+1;i++) s[0].f[i]=i;
for(i=1;i<=M[1]+1;i++) s[1].f[i]=i;
insert(0,1);
while(!pq.empty())
{
u=pq.top().second;
int flag=0;
for(i=s[0].find(p[u].a[0]);!flag&&i<=p[u].b[0];flag=1) insert(0,i),flag=1;
for(i=s[1].find(p[u].a[1]);!flag&&i<=p[u].b[1];flag=1) insert(1,i),flag=1;
if(!flag) pq.pop();
else ans+=p[u].val;
}
sort(p+1,p+n+1,cmp2);
for(i=1;i<=M[0]+1;i++) s[0].f[i]=i;
for(i=1;i<=M[1]+1;i++) s[1].f[i]=i;
for(i=1;i<=n;i++)
{
for(j=s[0].find(p[i].a[0]);j<=p[i].b[0];j=s[0].find(j))
ans+=(ll)(ref[j+1]-ref[j]-1)*p[i].val,s[0].f[j]=j+1,A-=ref[j+1]-ref[j]-1;
for(j=s[1].find(p[i].a[1]);j<=p[i].b[1];j=s[1].find(j))
ans+=(ll)(ref[j+1]-ref[j]-1)*p[i].val,s[1].f[j]=j+1,B-=ref[j+1]-ref[j]-1;
}
if(A||B) printf("-1");
else printf("%lld",ans);
return 0;
}