Pagini recente » Cod sursa (job #1663792) | Cod sursa (job #2142648) | Cod sursa (job #1176294) | Cod sursa (job #1512) | Cod sursa (job #132207)
Cod sursa(job #132207)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define mp make_pair
#define PII pair<int, int>
#define x first
#define y second
#define llong long long
#define INF (long long)(1<<20)*(1<<20)
#define LSB(x) ((x)&((x)-1)^(x))
#define FU(x) for(; x <= N; x += LSB(x))
#define FD(x) for(; x > 0; x -= LSB(x))
#define MAXN 100100
int N, XD[MAXN];
llong A[MAXN], aib[MAXN];
pair< PII, PII > X[MAXN];
void up(int x, llong val) { FU(x) aib[x] = min(aib[x], val); }
llong q(int x) { llong r=INF; FD(x) r = min(r, aib[x]); return r; }
void solve(void)
{
int i, j, k, len, t, p, aux;
sort(X+1, X+N+1);
for(i = 1; i <= N; i++) XD[i] = X[i].x.x+X[i].y.y;
sort(XD+1, XD+N+1);
for(i = 1; i <= N; i++) aib[i] = INF;
for(i = 1; i <= N; i++)
{
for(t = 0, len = 17; len >= 0; len--)
if(t+(1<<len) <= N && X[t+(1<<len)].x.x < X[i].x.x-X[i].y.x)
t += (1<<len);
if(t == 0)
A[i] = (llong)X[i].x.y;
else
{
for(p = 0, len = 17; len >= 0; len--)
if(p+(1<<len) <= N && XD[p+(1<<len)] < X[t].x.x) p += (1<<len);
A[i] = q(N-p) + (llong)X[i].x.y;
}
for(p = 0, len = 17; len >= 0; len--)
if(p+(1<<len) <= N && XD[p+(1<<len)] < X[i].x.x+X[i].y.y)
p += (1<<len);
up(N-p, A[i]);
}
}
void read_data(void)
{
int i, j, k;
scanf("%d\n", &N);
for(i = 1; i <= N; i++) scanf("%d %d %d %d\n", &X[i].x.x, &X[i].x.y,
&X[i].y.x, &X[i].y.y);
}
void write_data(void)
{
int i; llong res = INF;
for(i = 1; i <= N; i++)
if(X[i].x.x+X[i].y.y >= X[N].x.x)
res = min(res, A[i]);
printf("%lld\n", res);
}
int main(void)
{
freopen("stalpi.in", "rt", stdin);
freopen("stalpi.out", "wt", stdout);
read_data();
solve();
write_data();
return 0;
}