Cod sursa(job #132207)

Utilizator astronomyAirinei Adrian astronomy Data 5 februarie 2008 13:01:49
Problema Stalpi Scor Ascuns
Compilator cpp Status done
Runda Marime 1.99 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define mp make_pair
#define PII pair<int, int>
#define x first
#define y second
#define llong long long
#define INF (long long)(1<<20)*(1<<20)
#define LSB(x) ((x)&((x)-1)^(x))
#define FU(x) for(; x <= N; x += LSB(x))
#define FD(x) for(; x > 0; x -= LSB(x))
#define MAXN 100100

int N, XD[MAXN];
llong A[MAXN], aib[MAXN];
pair< PII, PII > X[MAXN];

void up(int x, llong val) { FU(x) aib[x] = min(aib[x], val); }
llong q(int x) { llong r=INF; FD(x) r = min(r, aib[x]); return r; }

void solve(void)
{
    int i, j, k, len, t, p, aux;

    sort(X+1, X+N+1);
    for(i = 1; i <= N; i++) XD[i] = X[i].x.x+X[i].y.y;
    sort(XD+1, XD+N+1);

    for(i = 1; i <= N; i++) aib[i] = INF;

    for(i = 1; i <= N; i++)
    {
        for(t = 0, len = 17; len >= 0; len--)
         if(t+(1<<len) <= N && X[t+(1<<len)].x.x < X[i].x.x-X[i].y.x)
            t += (1<<len);
        
        if(t == 0)
            A[i] = (llong)X[i].x.y;
        else
        {
            for(p = 0, len = 17; len >= 0; len--)
             if(p+(1<<len) <= N && XD[p+(1<<len)] < X[t].x.x) p += (1<<len);
            A[i] = q(N-p) + (llong)X[i].x.y;

        }
        
        for(p = 0, len = 17; len >= 0; len--)
         if(p+(1<<len) <= N && XD[p+(1<<len)] < X[i].x.x+X[i].y.y)
            p += (1<<len);

        up(N-p, A[i]);
    }
}

void read_data(void)
{
    int i, j, k;

    scanf("%d\n", &N);

    for(i = 1; i <= N; i++) scanf("%d %d %d %d\n", &X[i].x.x, &X[i].x.y,
    &X[i].y.x, &X[i].y.y);
}

void write_data(void)
{
    int i; llong res = INF;

    for(i = 1; i <= N; i++)
     if(X[i].x.x+X[i].y.y >= X[N].x.x)
        res = min(res, A[i]);

    printf("%lld\n", res);
}

int main(void)
{
    freopen("stalpi.in", "rt", stdin);
    freopen("stalpi.out", "wt", stdout);

    read_data();
    solve();
    write_data();

    return 0;
}