Cod sursa(job #3148861)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 4 septembrie 2023 18:21:39
Problema Stalpi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.05 kb
/// am realizat dupa doar 3 zile ca citeam prost datele
#include <fstream>
#include <algorithm>

using namespace std;

ifstream in ("stalpi.in");
ofstream out ("stalpi.out");

const long long max_size = 1e5 + 1, max_aint = 4e5 + 1, INF = 1e18 + 1;

struct str{
    long long x, st, dr, cost, lidx, ridx;
};

bool cmp1 (str x, str y)
{
    return x.x < y.x;
}

bool cmp2 (str x, str y)
{
    return x.lidx < y.lidx;
}

str v[max_size];
long long aint[max_aint], lazy[max_aint];

void push (long long nod, long long l, long long r)
{
    if (l != r)
    {
        lazy[2 * nod] = min(lazy[2 * nod], lazy[nod]);
        lazy[2 * nod + 1] = min(lazy[2 * nod + 1], lazy[nod]);
    }
    else
    {
        aint[nod] = min(aint[nod], lazy[nod]);
    }
    lazy[nod] = INF;
    return;
}

void upd (long long l, long long r, long long st, long long dr, long long val, long long nod)
{
    push(nod, l, r);
    if (st <= l && r <= dr)
    {
        lazy[nod] = val;
        return;
    }
    long long m = (l + r) / 2;
    if (st <= m)
    {
        upd(l, m, st, dr, val, 2 * nod);
    }
    if (dr > m)
    {
        upd(m + 1, r, st, dr, val, 2 * nod + 1);
    }
    /// e ff irelevant calcularea aintului, conteaza doar poz individuale
}

long long query (long long l, long long r, long long poz, long long nod)
{
    push(nod, l, r);
    if (l == r)
    {
        return aint[nod];
    }
    long long m = (l + r) / 2;
    if (poz <= m)
    {
        return query(l, m, poz, 2 * nod);
    }
    return query(m + 1, r, poz, 2 * nod + 1);
}

int main ()
{
    long long n;
    in >> n;
    for (long long i = 1; i <= n; i++)
    {
        in >> v[i].x >> v[i].cost >> v[i].st >> v[i].dr;
    }
    sort(v + 1, v + n + 1, cmp1);
    for (long long i = 1; i <= n; i++)
    {
        long long l = 1, r = i, aux = i;
        while (l <= r)
        {
            long long m = (l + r) / 2;
            if (v[m].x >= v[i].x - v[i].st)
            {
                aux = m;
                r = m - 1;
            }
            else
            {
                l = m + 1;
            }
        }
        v[i].lidx = aux;
        aux = i;
        l = i;
        r = n;
        while (l <= r)
        {
            long long m = (l + r) / 2;
            if (v[m].x <= v[i].x + v[i].dr)
            {
                aux = m;
                l = m + 1;
            }
            else
            {
                r = m - 1;
            }
        }
        v[i].ridx = aux;
    }
    sort(v + 1, v + n + 1, cmp2);
    for (long long i = 1; i <= 4 * n; i++)
    {
        aint[i] = INF;
        lazy[i] = INF;
    }
    for (long long i = 1; i <= n; i++)
    {
        long long aux;
        if (v[i].lidx == 1)
        {
            aux = v[i].cost;
        }
        else
        {
            aux = query(1, n, v[i].lidx - 1, 1) + v[i].cost;
        }
        upd(1, n, v[i].lidx, v[i].ridx, aux, 1);
    }
    out << query(1, n, n, 1);
    in.close();
    out.close();
    return 0;
}