//pku3616 Milking Time #include <iostream> #include <algorithm> #include <functional> using namespace std; typedef long INT32; typedef unsigned long UINT32; typedef struct tagINTERVAL { INT32 iStart; INT32 iEnd; INT32 iEff; inline bool operator < (const tagINTERVAL& in) const { return iEnd < in.iEnd; } } INTERVAL; typedef struct tagEFFACC { INT32 iEnd; INT32 iEffAcc; } EFFACC; const INT32 MAX_M = 1000; INTERVAL itvs[MAX_M+1]; EFFACC effs[MAX_M+1] = { {0,0} }; INT32 iEffsIndex = 1; INT32 GetEffAcc(INT32 iStart) { if (iStart <=0) return 0; INT32 start=0, end=iEffsIndex-1, mid; while (end > start) { mid = (start+end) / 2; if (iStart > effs[mid].iEnd) start = mid + 1; else if (iStart < effs[mid].iEnd) end = mid - 1; else // if (iStart == effs[mid].iEnd) return effs[mid].iEffAcc; } // end <= start if (iStart >= effs[start].iEnd) return effs[start].iEffAcc; else // if (iStart < effs[start].iEnd) return effs[start-1].iEffAcc; } int main() { INT32 iN, iM, iR; INT32 m; cin >> iN >> iM >> iR; for (m=1; m<=iM; m++) cin >> itvs[m].iStart >> itvs[m].iEnd >> itvs[m].iEff; sort(itvs+1, itvs+iM+1); effs[0].iEnd = effs[0].iEffAcc = 0; INT32 iMaxEff = 0; for (m=1; m<=iM; m++) { INT32 iEffAcc = itvs[m].iEff + GetEffAcc(itvs[m].iStart - iR); if (iMaxEff < iEffAcc) { iMaxEff = iEffAcc; effs[iEffsIndex].iEnd = itvs[m].iEnd; effs[iEffsIndex].iEffAcc = iMaxEff; iEffsIndex++; } } cout << iMaxEff << endl; return 0; }