Cod sursa(job #383659)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 17 ianuarie 2010 16:11:23
Problema Orase Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.26 kb
#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;
}