Pagini recente » Cod sursa (job #395583) | Monitorul de evaluare | Cod sursa (job #245214) | Cod sursa (job #2109261) | Cod sursa (job #97495)
Cod sursa(job #97495)
#include <stdio.h>
#define infile "orase.in"
#define outfile "orase.out"
#define nmax 50001
long n, m, i, j, last, rez, aux;
long d[nmax], l[nmax];
long c[nmax],dist;
void readData();
void writeData();
void solve();
long divide(long,long);
void qSort(long,long);
int main()
{
readData();
solve();
writeData();
return 0;
}
void readData()
{
freopen(infile, "r", stdin);
scanf("%ld %ld\n", &m, &n);
for ( i=1; i<=n; i++ )
scanf("%ld %ld\n", &d[i], &l[i]);
}
void solve()
{
long aux;
qSort(1,n);
c[2]=1;
rez=d[2]-d[1]+l[1]+l[2];
for (i=3; i<=n; i++)
{
if (d[i]-d[i-1]+l[i]+l[i-1] > d[i]-d[c[i-1]]+l[i]+l[c[i-1]])
{
c[i]=i-1;
aux=d[i]-d[i-1]+l[i]+l[i-1];
if (aux>rez) rez=aux;
}
else
{
c[i]=c[i-1];
aux=d[i]-d[c[i-1]]+l[i]+l[c[i-1]];
if (aux>rez) rez=aux;
}
}
}
void writeData()
{
freopen(outfile, "w", stdout);
printf("%ld\n", rez);
fclose(stdout);
}
long divide(long p, long q)
{
long st=p, dr=q, x=d[p], y=l[p];
while (st < dr)
{
while ( st<dr && d[dr]>=x ) dr--;
d[st]=d[dr];
l[st]=l[dr];
while ( st<dr && d[st]<=x ) st++;
d[dr]=d[st];
l[dr]=l[st];
}
d[st]=x;
l[st]=y;
return st;
}
void qSort(long p, long q)
{
long m=divide(p,q);
if (m-1>p) qSort(p, m-1);
if (m+1<q) qSort(m+1, q);
}