Pagini recente » Cod sursa (job #1196312) | Cod sursa (job #1903224) | Cod sursa (job #1487787) | Cod sursa (job #1028404) | Cod sursa (job #2865330)
#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;
}