Cod sursa(job #68172)

Utilizator floringh06Florin Ghesu floringh06 Data 26 iunie 2007 19:15:45
Problema Orase Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
using namespace std;

#define MAX_N 50005
#define max(a,b) ((a)>(b)?(a):(b))

#include <stdio.h>
#include <fstream>

FILE *fin=fopen("orase.in","r"),
     *fout=fopen("orase.out","w");
    
typedef struct 
 {
   int d1;
   int d2;
 } intersection;      
     
int m,n,i;
intersection a[MAX_N];
int b[MAX_N];
int c[MAX_N];     

void sort()
{
int i,j,k;
intersection aux;
for(i=1;i<=n;i=i+1) 
  {
  j=i;
  while(j/2 && a[j/2].d1<a[j].d1) 
     {
     aux=a[j/2];
     a[j/2]=a[j];
     a[j]=aux;

     j=j/2;
     }
  }
i=n;
while(i>1)
  {
  aux=a[1];
  a[1]=a[i];
  a[i]=aux;
  i=i-1; 

  j=1;
  while(1)
    {
    k=2*j;
    if(k>i) break;
    if(k+1<=i && a[k+1].d1>a[k].d1) k=k+1;
    if(a[j].d1 >= a[k].d1) break;

    aux=a[j];
    a[j]=a[k];
    a[k]=aux;

    j=k;
    }
  }
}
     
int main()
{
   fscanf(fin,"%d %d",&m,&n);
   for (i=1; i<=n; i++)
    fscanf(fin,"%d %d",&a[i].d1,&a[i].d2);      
   sort();
   memset(b,0,sizeof(b));
   b[1]=a[1].d2;
   for (i=2; i<=n; i++) 
      b[i]=max(b[i-1]+a[i].d1-a[i-1].d1,a[i].d2);
   c[n]=a[n].d2;   
   for (i=n-1; i>=1; i--) 
      c[i]=max(c[i+1]+a[i+1].d1-a[i].d1,a[i].d2);
   int sol=0;
   for (i=1; i<=n; i++) {
    if (a[i].d2+b[i]>sol) sol=a[i].d2+b[i];
    if (a[i].d2+c[i]>sol) sol=a[i].d2+c[i];
   }      
   fprintf(fout,"%d\n",sol);
   fclose(fin);
   fclose(fout);
   return 0;
}