Cod sursa(job #1282590)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 4 decembrie 2014 15:28:47
Problema Orase Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <stdio.h>
#define MAXN 50000
int x[MAXN], y[MAXN], n;
inline int tata(int p){
    return (p-1)/2;
}
inline int fiust(int p){
    return p*2+1;
}
inline int fiudr(int p){
    return p*2+2;
}
inline void swap(int a, int b){
    int aux=x[a];
    x[a]=x[b];
    x[b]=aux;
    aux=y[a];
    y[a]=y[b];
    y[b]=aux;
}
inline void coborare(int p){
    int q, f;
    f=1;
    while((f==1)&&(fiust(p)<n)){
        q=fiust(p);
        if((fiudr(p)<n)&&(x[q]<x[fiudr(p)])){
            q=fiudr(p);
        }
        if(x[p]<x[q]){
            swap(p, q);
            p=q;
        }else{
            f=0;
        }
    }
}
inline void heapify(){
    int i;
    for(i=tata(n-1); i>=0; i--){
        coborare(i);
    }
}
inline void heapSort(){
    while(n>1){
        n--;
        swap(0, n);
        coborare(0);
    }
}
inline void mySort(){
    int cn=n;
    heapify();
    heapSort();
    n=cn;
}
int main(){
    int lim, i, rez, max;
    FILE *fin, *fout;
    fin=fopen("orase.in", "r");
    fout=fopen("orase.out", "w");
    fscanf(fin, "%d%d", &lim, &n);
    for(i=0; i<n; i++){
        fscanf(fin, "%d%d", &x[i], &y[i]);
    }
    mySort();
    rez=x[1]-x[0]+y[0]+y[1];
    max=rez;
    for(i=2; i<n; i++){
        rez+=x[i]-x[i-1]+y[i]-y[i-1];
        if(rez<y[i-1]+x[i]-x[i-1]+y[i]){
            rez=y[i-1]+x[i]-x[i-1]+y[i];
        }
        if(max<rez){
            max=rez;
        }
    }
    fprintf(fout, "%d\n", max);
    fclose(fin);
    fclose(fout);
    return 0;
}