Pagini recente » Cod sursa (job #1438390) | Cod sursa (job #906190)
Cod sursa(job #906190)
#include <fstream>
#define nmax 100100
#define oo (1LL<<62)
#define lsb(x) (x&-x)
#define ll long long
using namespace std;
struct stalp{int A,B,Cost;}Stalp[nmax];
int N,Step,X[nmax];
ll AIB[nmax];
bool compare(stalp X,stalp Y) {
return X.A<Y.A;
}
void Update(int Nod,ll Val) {
for(;Nod;Nod-=lsb(Nod))
AIB[Nod]=min(AIB[Nod],Val);
}
ll Query(int Nod) {
ll Answer=0;
if(Nod)
for(Answer=oo;Nod<=N;Nod+=lsb(Nod))
Answer=min(Answer,AIB[Nod]);
return Answer;
}
int BinarySearch(int Val) {
int i,step;
for(i=0,step=Step;step;step>>=1)
if(i+step<=N && X[i+step]<Val)
i+=step;
return i;
}
void solve() {
int i,L,R;
long long Val;
sort(X+1,X+N+1);
sort(Stalp+1,Stalp+N+1,compare);
for(Step=1;Step<N;Step<<=1);
for(i=1;i<=N;i++)
AIB[i]=oo;
for(i=1;i<=N;i++) {
L=BinarySearch(Stalp[i].A);
Val=Query(L)+Stalp[i].Cost;
R=BinarySearch(Stalp[i].B);
if(R+1<=N && X[R+1]<=Stalp[i].B)
R++;
Update(R,Val);
}
}
void read() {
ifstream in("stalpi.in");
in>>N;
for(int i=1;i<=N;i++) {
in>>X[i]>>Stalp[i].Cost>>Stalp[i].A>>Stalp[i].B;
Stalp[i].A=X[i]-Stalp[i].A;
Stalp[i].B+=X[i];
}
in.close();
}
void write() {
ofstream out("stalpi.out");
out<<AIB[N]<<'\n';
out.close();
}
int main() {
read();
solve();
write();
return 0;
}