Pagini recente » Cod sursa (job #531442) | Cod sursa (job #2264651) | Cod sursa (job #1091213) | Cod sursa (job #2417326) | Cod sursa (job #383659)
Cod sursa(job #383659)
#include<stdio.h>
#define infile "orase.in"
#define outfile "orase.out"
#define nmax (50*1001)
struct oras
{
int d; //distanta de la capatul stang al strazii principale pana la alee
int l; //distanta aleii (de la strada principala la oras)
} o[nmax]; //informatiile oraselor
int n; //numarul de orase
int m; //dstanta strazii principale
int dmax; //distanta maxima dintre doua orase
inline int max(int a, int b)
{
if(a>b) return a; return b;
}
void read()
{
int i;
scanf("%d %d\n",&m,&n);
for(i=1;i<=n;i++)
scanf("%d %d\n",&o[i].d,&o[i].l);
}
int divide(int st, int dr)
{
struct oras x=o[st];
while(st<dr)
{
while(st<dr && (o[dr].d>x.d || (o[dr].d==x.d && o[dr].l<=x.l))) dr--;
o[st]=o[dr];
while(st<dr && (o[st].d<x.d || (o[st].d==x.d && o[st].l>=x.l))) st++;
o[dr]=o[st];
}
o[st]=x;
return st;
}
void qsort(int st, int dr)
{
int mij=divide(st,dr);
if(st<mij-1) qsort(st,mij-1);
if(mij+1<dr) qsort(mij+1,dr);
}
void solve()
{
int i,j;
for(i=1,j=2;j<=n;j++)
{
dmax=max(dmax,o[i].l+o[j].l+o[j].d-o[i].d);
if(o[j].l-o[j].d > o[i].l-o[i].d) i=j;
}
}
void write()
{
printf("%d\n",dmax);
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
qsort(1,n);
solve();
write();
fclose(stdin);
fclose(stdout);
return 0;
}