Cod sursa(job #366381)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 21 noiembrie 2009 17:49:12
Problema Orase Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<fstream>
#include<iostream>
#define inf "orase.in"
#define outf "orase.out"
#define MaxN 50001
#define MINF -0x3f3f3f3f
using namespace std;

fstream f(inf,ios::in),g(outf,ios::out);

int N;
long M;
long D[MaxN],L[MaxN];
long Max[MaxN];
int st,sf;

void Citire()
{
f>>M>>N;
for(int i=1;i<=N;i++)
    {
    f>>D[i]>>L[i];
    }
}

void Sort(int i,int j)
{
long aux;
if(D[i]>D[j])
    {
    aux=D[i];
    D[i]=D[j];
    D[j]=aux;
    aux=L[i];
    L[i]=L[j];
    L[j]=aux;
    }
else if(D[i]==D[j])
    {
    if(L[i]>L[j])
        {
        aux=L[i];
        L[i]=L[j];
        L[j]=aux;
        }
    }
}

void Merge(int p,int q,int m)
{
long v[MaxN],a[MaxN];
int i,j,k=1;
i=p;j=m+1;
while( (i<=m) && (j<=q) )
    {
    if(D[i]<=D[j])
        {
        v[k]=D[i];
        a[k]=L[i];
        k++;
        i++;
        }
    else
        {
        v[k]=D[j];
        a[k]=L[j];
        k++;
        j++;
        }
    }
if(i<=m)
    {
    for(j=i;j<=m;j++)
        {
        v[k]=D[j];
        a[k]=L[j];
        k++;
        }
    }
else
    {
    for(i=j;i<=q;i++)
        {
        v[k]=D[i];
        a[k]=L[i];
        k++;
        }
    }
k=1;
for(i=p;i<=q;i++)
    {
    D[i]=v[k];
    L[i]=a[k];
    k++;
    }
}

void MergeSort(int i,int j)
{
int m;
if((j-i)<=1)Sort(i,j);
else
    {
    m=(i+j)/2;
    MergeSort(i,m);
    MergeSort(m+1,j);
    Merge(i,j,m);
    }
}

int main()
{
long max;
Citire();
MergeSort(1,N);
/*for(int i=1;i<=N;i++)
    {
    g<<D[i]<<" "<<L[i]<<endl;
    }*/
//Max[1]=MINF;
Max[2]=D[2]-D[1]+L[1]+L[2];
st=1;
sf=2;
//g<<D[2]<<" "<<L[2]<<endl;
int poz,poz2;
for(int i=3;i<=N;i++)
    {
    poz=sf;
    poz2=st;
    //g<<sf<<endl;
    if(Max[sf]-L[sf]+(D[i]-D[sf])+L[i]>Max[sf])
        {
        Max[i]=Max[sf]-L[sf]+(D[i]-D[sf])+L[i];
        poz=i;
        }
    if(L[i]+L[i-1]+(D[i]-D[i-1])>Max[sf])
        {
        Max[i]=L[i]+L[i-1]+(D[i]-D[i-1]);
        poz2=i-1;
        poz=i;
        }
    else Max[i]=Max[sf];
    st=poz2;
    sf=poz;
    }
//for(int i=1;i<=N;i++)g<<Max[i]<<" ";
//g<<endl;
g<<Max[N];
f.close();
g.close();
return 0;
}