Pagini recente » Cod sursa (job #2943273) | Borderou de evaluare (job #2385655) | Cod sursa (job #250452) | Cod sursa (job #451022) | Cod sursa (job #2971022)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin ("stalpi.in");
ofstream cout ("stalpi.out");
#define NMAX 100005
int stalpi[NMAX];
struct INTERVAL{
int x, y, cost;
};
INTERVAL intervals[NMAX];
INTERVAL new_intervals[NMAX];
bool cmp ( const INTERVAL& a, const INTERVAL& b ) {
return a.cost < b.cost;
}
int main()
{
int n, i;
cin >> n;
for ( i = 1; i <= n; i++ ) {
cin >> stalpi[i];
cin >> intervals[i].cost >> intervals[i].x >> intervals[i].y;
intervals[i].x = max (0, stalpi[i] - intervals[i].x);
intervals[i].y = stalpi[i] + intervals[i].y;
}
sort ( stalpi + 1, stalpi + n + 1 );
int poz = 0;
for ( i = 1; i <= n; i++ ) {
int st, dr, mid, first_greater = -1, last_smaller = -1;
st = 1;
dr = n;
while ( st <= dr ) {
mid = ( st + dr ) / 2;
if ( intervals[i].x <= stalpi[mid] ) {
first_greater = mid;
dr = mid - 1;
}
else {
st = mid + 1;
}
}
st = 1;
dr = n;
while( st <= dr ) {
mid = ( st + dr ) / 2;
if ( intervals[i].y >= stalpi[mid] ) {
last_smaller = mid;
st = mid + 1;
}
else {
dr = mid - 1;
}
}
if ( first_greater <= last_smaller && first_greater != -1 && last_smaller != -1 ) {
new_intervals[poz].x = first_greater;
new_intervals[poz].y = last_smaller;
new_intervals[poz++].cost = intervals[i].cost;
}
}
sort ( new_intervals, new_intervals + poz, cmp );
int ans = new_intervals[0].cost;
int st = new_intervals[0].x, dr = new_intervals[0].y;
for ( i = 1; i < poz; i++ ) {
if ( st > new_intervals[i].x || new_intervals[i].y > dr ) {
ans += new_intervals[i].cost;
st = min ( st, new_intervals[i].x );
dr = max ( dr, new_intervals[i].y );
}
else if ( ans > new_intervals[i].cost ) {
ans = new_intervals[i].cost;
}
}
cout << ans;
return 0;
}