Cod sursa(job #906190)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 6 martie 2013 16:30:27
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#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;

}