Cod sursa(job #68073)

Utilizator cos_minBondane Cosmin cos_min Data 26 iunie 2007 13:35:01
Problema Orase Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.05 kb
#include <stdio.h>
using namespace std;

#define in "orase.in"
#define out "orase.out"
#define dim 50001

int N, M;
int D1[dim], L1[dim];
int D2[dim], L2[dim];

void Qsort1(int,int);
void Qsort2(int,int);

int main()
{
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%d%d", &M, &N);
    for ( int i = 1; i <= N; i++ )
        scanf("%d%d", &D1[i], &L1[i]), D2[i] = D1[i], L2[i] = L1[i];
    // N*logN
    int maxim = -1;
    Qsort1(1,N); // dupa D
    
    for ( int i = 1; i <= N/2; i++ )
    {
        if ( N-i+1 != i )
        {
             if ( maxim < L1[i] + L1[N-i+1] - D1[i] ) maxim = L1[i] + L1[N-i+1] + D1[N-i+1] - D1[i]; 
        }
    }
    
    if ( N % 2 == 1 ) 
       if ( maxim < L1[N/2] + L1[N/2+1] - D1[N/2] ) maxim = L1[N/2] + L1[N/2+1] - D1[N/2]; 
    
    Qsort2(1,N);
    
    int q;
    
    if ( D2[N] < D2[N-1] ) q = D2[N-1]-D2[N];
    else                   q = D2[N]-D2[N-1];
    
    if ( maxim < L2[N] + L2[N-1] + q ) maxim = L2[N] + L2[N-1] + q;
    
    /*for ( int i = 1; i <= N/2; i++ )
    {
        if ( N-i+1 != i )
        {
             if ( D2[i] < D2[N-i+1] ) q = D2[N-i+1]-D2[i];
             else                     q = D2[i]-D2[N-i+1];
             
             if ( maxim < L2[i] + L2[N-i+1] + q ) maxim = L2[i] + L2[N-i+1] + q; 
        }
    }*/
    
    
    /* N*N 
    int q, maxim=-1;
    for ( int i = 1; i < N; i++ )
        for ( int j = i+1; j <= N; j++ )
        {
            if ( D2[i] < D2[j] ) q = D2[j]-D2[i];
             else                    q = D2[i]-D2[j];
             
             if ( maxim < L2[i] + L2[j] + q ) maxim = L2[i] + L2[j] + q; 
        }
            */
    
    printf("%d", maxim);
}

void Qsort1(int st, int dr)
{
     int i = st-1;
     int j = dr+1;
     int pivotd = D1[st];
     int pivotl = L1[st];
     
     while ( i <= j )
     {
           do { i++; } while ( D1[i] < pivotd || ( D1[i] == pivotd && L1[i] < pivotl ) );
           do { j--; } while ( D1[j] > pivotd || ( D1[j] == pivotd && L1[j] > pivotl ) );
           if ( i <= j )
           {
                int aux = D1[i];
                D1[i] = D1[j];
                D1[j] = aux;
                aux = L1[i];
                L1[i] = L1[j];
                L1[j] = aux;
           }
     } 
     
     if ( st < j ) Qsort1(st,j);
     if ( i < dr ) Qsort1(i,dr);
}

void Qsort2(int st, int dr)
{
     int i = st-1;
     int j = dr+1;
     int pivotd = D2[st];
     int pivotl = L2[st];
     
     while ( i <= j )
     {
           do { i++; } while ( L2[i] < pivotl || ( L2[i] == pivotl && D2[i] < pivotd ) );
           do { j--; } while ( L2[j] > pivotl || ( L2[j] == pivotl && D2[j] > pivotd ) );
           if ( i <= j )
           {
                int aux = D2[i];
                D2[i] = D2[j];
                D2[j] = aux;
                aux = L2[i];
                L2[i] = L2[j];
                L2[j] = aux;
           }
     } 
     
     if ( st < j ) Qsort2(st,j);
     if ( i < dr ) Qsort2(i,dr);
}