Cod sursa(job #137351)

Utilizator stef2nStefan Istrate stef2n Data 17 februarie 2008 11:32:15
Problema Stalpi Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 2.89 kb
//#define _DEBUG_

#include <cstdio>
#ifdef _DEBUG_
#include <iostream>
#endif
#include <algorithm>
using namespace std;

struct stalp
{
    int X, C, S, D;
};
const int MAX_N = 100005;
const long long INF = 1LL << 60;
const int NOT_FOUND = -2000000000;
const int MAX_ARB = 262144;

int N;
stalp A[MAX_N];
int XX[MAX_N];
long long ARB[MAX_ARB];

inline bool cmp(const stalp &A, const stalp &B)
{
    return A.D < B.D;
}

inline long long min(long long x, long long y)
{
    return x<y ? x : y;
}

void build(int n, int lo, int hi)
{
    ARB[n]=INF;
    if(lo==hi)
        return;
    build(2*n, lo, (lo+hi)/2);
    build(2*n+1, (lo+hi)/2+1, hi);
}

void insert(int n, int lo, int hi, const int &p, const int &value)
{
    if(lo==hi)
    {
        ARB[n]=value;
        return;
    }
    if(p<=(lo+hi)/2)
        insert(2*n, lo, (lo+hi)/2, p, value);
    else
        insert(2*n+1, (lo+hi)/2+1, hi, p, value);
    ARB[n]=min(ARB[2*n], ARB[2*n+1]);
}

int bin_search(const int &value, int lo, int hi)
{
    if(lo>hi)
        return NOT_FOUND;
    if(XX[(lo+hi)/2]>=value)
        return bin_search(value, lo, (lo+hi)/2-1);
    int tmp=bin_search(value, (lo+hi)/2+1, hi);
    return tmp==NOT_FOUND ? XX[(lo+hi)/2] : tmp;
}

int bin_search2(const int &value, int lo, int hi)
{
    if(lo>hi)
        return -1;
    if(A[(lo+hi)/2].D<value)
        return bin_search2(value, (lo+hi)/2+1, hi);
    int tmp=bin_search2(value, lo, (lo+hi)/2-1);
    return tmp==-1 ? (lo+hi)/2 : tmp;
}

long long query(int n, int lo, int hi, const int &LI, const int &LS)
{
    if(LI<=lo && hi<=LS)
        return ARB[n];
    long long value=INF;
    if(LI<=(lo+hi)/2)
        value=query(2*n, lo, (lo+hi)/2, LI, LS);
    if(LS>(lo+hi)/2)
        value=min(value, query(2*n+1, (lo+hi)/2+1, hi, LI, LS));
    return value;
}

void solve()
{
    long long value;
    int tmp, p;
    for(int i=0; i<N; ++i)
    {
        value=INF;
        tmp=bin_search(A[i].S, 0, N-1);
        if(tmp==NOT_FOUND)
            value=A[i].C;
        else
        {
            p=bin_search2(tmp, 0, N-1);
            if(p!=-1)
            {
                value=A[i].C+query(1, 0, N-1, p, N-1);
                if(value>INF)
                    value=INF;
            }
        }
        insert(1, 0, N-1, i, value);
    }
}


int main()
{
    freopen("stalpi.in", "r", stdin);
    freopen("stalpi.out", "w", stdout);
    scanf("%d", &N);
    for(int i=0; i<N; ++i)
    {
        scanf("%d %d %d %d", &A[i].X, &A[i].C, &A[i].S, &A[i].D);
        A[i].S = A[i].X - A[i].S;
        A[i].D += A[i].X;
    }
    sort(A, A+N, cmp);
    for(int i=0; i<N; ++i)
        XX[i] = A[i].X;
    sort(XX, XX+N);

#ifdef _DEBUG_
    for(int i=0; i<N; ++i)
        cerr<<A[i].D<<" ";
    cerr<<endl;
    for(int i=0; i<N; ++i)
        cerr<<XX[i]<<" ";
    cerr<<endl;
#endif

    build(1, 0, N-1);
    solve();
    int p=bin_search2(XX[N-1], 0, N-1);
    printf("%Ld\n", query(1, 0, N-1, p, N-1));

    return 0;
}