Cod sursa(job #1744646)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 20 august 2016 02:21:06
Problema Stalpi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

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

const int MAXN = 100000;

struct Pole {
    int cost;
    int left;
    int right;
};

Pole v[1 + MAXN];

int n, aib[1 + MAXN], x[1 + MAXN];

bool Compare(const Pole &a, const Pole &b) {
    return a.right < b.right;
}

void Update(int index, int value) {
    for (index; index > 0; index -= (index & -index))
        aib[index] = min(aib[index], value);
}

int Query(int index) {
    int answer = 2000000000;
    for (index; index <= n; index += (index & -index))
        answer = min(answer, aib[index]);
    return answer;
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> x[i] >> v[i].cost >> v[i].left >> v[i].right;
        v[i].left = x[i] - v[i].left;
        v[i].right = x[i] + v[i].right;
    }
    memset(aib, 0x3f, sizeof(aib));
    sort(x + 1, x + n + 1);
    sort(v + 1, v + n + 1, Compare);
    for (int i = 1; i <= n; i++) {
        int index = lower_bound(x + 1, x + n + 1, v[i].left) - x - 1;
        int value = 0;
        if (index != 0)
            value = Query(index);
        value += v[i].cost;
        index = upper_bound(x + 1, x + n + 1, v[i].right) - x - 1;
        Update(index, value);
    }
    cout << aib[n];
    return 0;
}