RT.
#include<bits/stdc++.h>
#define int long long
#define INF 0x3f
using namespace std;
int tree[80005],lazy[80005];
void pushdown(int x) {
if(lazy[x]) {
tree[x*2]+=lazy[x];
lazy[x*2]+=lazy[x];
tree[x*2+1]+=lazy[x];
lazy[x*2+1]+=lazy[x];
lazy[x]=0;
}
}
int query(int l,int r,int s,int t,int p) {
if(l<=s && t<=r) return tree[p];
if(l>t || r<s) return -INF;
int m=s+((t-s)>>1),ans=-INF;
pushdown(m);
if(l<=m) ans=max(ans,query(l,r,s,m,p*2));
if(r>m) ans=max(ans,query(l,r,m+1,t,p*2+1));
return ans;
}
void update(int l,int r,int c,int s,int t,int p) {
if(l<=s && t<=r) {
lazy[p]+=c;
tree[p]+=c;
return;
}
if(l>t || r<s) return;
int m=s+((t-s)>>1);
pushdown(m);
if(l<=m) update(l,r,c,s,m,p*2);
if(r>m) update(l,r,c,m+1,t,p*2+1);
tree[p]=max(tree[p*2],tree[p*2+1]);
}
int k,n,c;
struct node{
int st;
int en;
int num;
};
bool cmp(node t1,node t2) {
if(t1.en!=t2.en) return t1.en<t2.en;
else return t1.st<t2.st;
}
node a[50005];
int b[50005];
int ans;
signed main() {
cin>>k>>n>>c;
for(int i=1;i<=k;i++) {
cin>>a[i].st>>a[i].en>>a[i].num;
}
sort(a+1,a+k+1,cmp);
for(int i=1;i<=k;i++) {
int kk=query(a[i].st,a[i].en-1,1,n,1);
ans+=min(a[i].num,c-kk);
update(a[i].st,a[i].en-1,min(a[i].num,c-kk),1,n,1);
}
cout<<ans;
return 0;
}