//code by Dreamer_002
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 2e5 + 2e3;
const int M = 5005;
struct red{
int l,r,w;
};
struct blue{
int l,r;
};
struct qujian{
int l,r;
};
qujian c[M];
red a[N];
blue b[M];
int n,m,k,pre[M],w[M],cc[M],s[N],ss[N],f[M][M];
bool cmp1(red x,red y){
return x.l==y.l?x.r<y.r:x.l<y.l;
}
bool cmp2(blue x,blue y){
return x.l==y.l?x.r<y.r:x.l<y.l;
}
int minn(int a,int b);
int maxx(int a,int b);
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].w);
}
sort(a+1,a+1+n,cmp1);
for(int i=1;i<=n;i++){
s[i]=s[i-1]+a[i].w;
ss[i]=ss[i-1]+a[i].r-a[i].l+1;
}
for(int i=1;i<=m;i++){
scanf("%d%d",&b[i].l,&b[i].r);
}
sort(b+1,b+1+m,cmp2);
for(int i=1;i<=m;i++){
int l=1,r=n+1,mid,ansl=-1,ansr=-1;
while(l<=r){
mid=(l+r)>>1;
if(a[mid].r<b[i].l){
l=mid+1;
}
else{
r=mid-1;
ansl=mid;
}
}
if(ansl==-1)continue;
l=0;r=n;
while(l<=r){
mid=(l+r)>>1;
if(a[mid].l>b[i].r){
r=mid-1;
}
else{
l=mid+1;
ansr=mid;
}
}
//if(ansr>n)ansr=n;
if(ansr==-1)continue;
c[i].l=ansl;c[i].r=ansr;
w[i]=s[ansr]-s[ansl-1];
if(ansr==ansl){
cc[i]=minn(a[ansl].r,b[i].r)-maxx(a[ansl].l,b[i].l)+1;
}
else if(ansr>ansl){
cc[i]=ss[ansr-1]-ss[ansl];
cc[i]+=minn(a[ansl].r,b[i].r)-maxx(a[ansl].l,b[i].l)+1;
cc[i]+=minn(a[ansr].r,b[i].r)-maxx(a[ansr].l,b[i].l)+1;
}
else{
c[i].r=c[i-1].r;c[i].l=-1;
w[i]=0;
}
}
for(int i=1;i<=m;i++){
pre[i]=i-1;
if(c[i].l==-1)continue;
int l=1,r=i,mid,ans=-1;
while(l<=r){
mid=(l+r)>>1;
if(c[mid].r<c[i].l){
l=mid+1;
ans=mid;
}
else{
r=mid-1;
}
}
if(ans==-1) continue;
pre[i]=ans;
}
for(int i=1;i<=m;i++){
for(int j=k;j>=0;j--){
if(j>=w[i])
f[i][j]=maxx(f[i-1][j],f[pre[i]][j-w[i]]+cc[i]);
else f[i][j]=f[i-1][j];
}
}
int ans=0;
for(int j=0;j<=k;j++){
ans=maxx(ans,f[m][j]);
}
printf("%d\n",ans);
return 0;
}
int minn(int a,int b){
return a<b?a:b;
}
int maxx(int a,int b){
return a>b?a:b;
}
悲,其余subtask都有A有Wa 记录