Pagini recente » Cod sursa (job #2709563) | Cod sursa (job #683943) | Rating Mihai Ionescu (MihaIonescu) | Cod sursa (job #2970427) | Cod sursa (job #1744646)
#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;
}