Cod sursa(job #2865330)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 8 martie 2022 18:48:29
Problema Stalpi Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

typedef long long ll;

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

const int N = 1e5;
const ll INF = 1e18;

struct stalp{
    int x, c, s, d;
};

int n;
int x[N + 5];
stalp v[N + 5];
vector<ll> bit(N + 5, INF);

int search_left(int value) {
    int l = 1, r = n, ans = n;
    while (l <= r) {
        int mid = (l + r) / 2;
        if (x[mid] >= value) {
            ans = mid;
            r = mid - 1;
        } else
            l = mid + 1;
    }
    return ans;
}

int search_right(int value) {
    int l = 1, r = n, ans = 1;
    while (l <= r) {
        int mid = (l + r) / 2;
        if (x[mid] <= value) {
            ans = mid;
            l = mid + 1;
        } else
            r = mid - 1;
    }
    return ans;
}

bool comp(stalp a, stalp b) {
    if (a.d == b.d)
        return a.s < b.s;
    return a.d < b.d;
}

int lsb(int nr) {
    return nr & -nr;
}

void update(int index, ll value) {
    for (int i = index; i >= 1; i -= lsb(i))
        bit[i] = min(bit[i], value);
}

ll query(int index) {
    ll ans = INF;
    for (int i = index; i <= n; i += lsb(i))
       ans = min(bit[i], ans);
    return ans;
}

int main() {
    in >> n;
    for (int i = 1; i <= n; i++) {
        in >> x[i] >> v[i].c >> v[i].s >> v[i].d;
        v[i].x = x[i];
    }
    sort(x + 1, x + n + 1);
    for (int i = 1; i <= n; i++) {
        v[i].s = search_left(v[i].x - v[i].s);
        v[i].d = search_right(v[i].x + v[i].d);
    }
    sort(v + 1, v + n + 1, comp);
    for (int i = 1; i <= n; i++) {
        //cout << i << ' ' << v[i].s << ' ' << v[i].d << '\n';
        if (v[i].s == 1)
            update(v[i].d, 1LL * v[i].c);
        else {
            ll cost = query(v[i].s) + v[i].c;
            update(v[i].d, cost);
        }
    }
    out << query(n) << '\n';
    return 0;
}