Cod sursa(job #2184956)

Utilizator Vaida_Radu_AndreiVaida Radu Andrei Vaida_Radu_Andrei Data 24 martie 2018 12:12:16
Problema Orase Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <cstdio>
#include <algorithm>

using namespace std;
FILE* FIN=freopen("orase.in","r",stdin);
FILE* FOUT=freopen("orase.out","w",stdout);

struct drum
{
    int l;
    int d;
};

int n,m,sol;
drum v[50025],maxv;

bool cmp(int i,int j)
{
    return v[i].d<v[j].d;
}
void citire()
{
    int i;
    maxv.l=0;
    maxv.d=0;
    scanf("%d%d",&m,&n);
    for(i=0;i<n;i++)
    {
        scanf("%d%d",&v[i].d,&v[i].l);
        if(maxv.l<v[i].l)
        {
            maxv.l=v[i].l;
            maxv.d=v[i].d;
        }
    }
    sort(v,v+n,cmp);
}
void whoismax(int &poz)
{
    int log;
    for(log=1;log<=n;log<<=1);
    for(poz=-1;log;log>>=1)
        if(poz+log<n&&v[poz+log].d<maxv.d)
            poz+=log;
    poz++;
}
void play(int poz)
{
    int i,p1=0,j,p2=n-1,x;
    for(i=1;i<poz;i++)
    {
        if(v[p1].l+v[i].d-v[p1].d>v[i].l)
            p1=i;
    }
    for(j=n-2;j>poz;j--)
    {
        if(v[p2].l+v[p2].d-v[j].l>v[j].l)
            p2=j;
    }
    sol=v[p1].l+v[p2].l+v[p2].d-v[p1].d;
    x=v[p1].l+v[poz].d+v[poz].l-v[p1].l;
    if(sol<x)
        sol=x;
    x=v[p2].l+v[poz].l+v[p2].d-v[poz].d;
    if(sol<x)
        sol=x;
}
int main()
{
    int p;
    citire();
    whoismax(p);
    play(p);
    printf("%d",sol);
    return 0;
}