Cod sursa(job #968896)
//Initial facusem cu un heap, dar nu avem nevoie de stergeri, deci putem doar sa retinem maximul la fiecare pas!
//Solutia este un simplu Gready: Pentru fiecare oras (dupa ce le sortam crescator dupa v[i].d) alegem un altul
//care se afla inainte de el (dupa criteriul de sortare) - il numim x - pentru care x.h-x.d este maxim (astfel
//avem distanta dintre cele doua orase v[i].h+v[i].h+x.h-x.d maxima).
#include <fstream>
#include <algorithm>
//#include <queue>
using namespace std;
struct elem
{
int d;
int h;
}v[50005];
bool comp(const elem &a,const elem &b)
{
if(a.d<b.d)
return 1;
else if(a.d==b.d)
if(a.h<b.h)
return 1;
return 0;
}
//bool operator<(const elem &a,const elem &b)
//{
// if((a.h-a.d)<(b.h-b.d))
// return 1;
// return 0;
//}
int main()
{
ifstream cin("orase.in");
ofstream cout("orase.out");
int n,m,i;
cin>>m>>n;
for(i=0;i<n;i++)
cin>>v[i].d>>v[i].h;
sort(v,v+n,comp);
//priority_queue<elem> coada;
//coada.push(v[0]);
int sol=-1,aux;
elem best=v[0];
for(i=1;i<n;i++)
{
aux=v[i].h+v[i].d-best.d+best.h;
if(aux>sol)
sol=aux;
if((v[i].h-v[i].d)>(best.h-best.d))
best=v[i];
//coada.push(v[i]);
}
cout<<sol<<'\n';
cin.close();
cout.close();
return 0;
}