Cod sursa(job #983433)

Utilizator stefanzzzStefan Popa stefanzzz Data 11 august 2013 19:43:54
Problema Stalpi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <fstream>
#include <algorithm>
#define MAXN 100005
#define INF 2000000000
using namespace std;
ifstream f("stalpi.in");
ofstream g("stalpi.out");

struct interval{
    int l,r,cost;};

int n,v[MAXN],ai[4*MAXN],a,b,mnq,mn;
interval intervale[MAXN];

bool Comp(interval a,interval b){
    return a.r<b.r;}

int MIN(int a,int b){
    return (a<b)?(a):(b);}

void build_ai(int nod,int st,int dr);
void query(int nod,int st,int dr);
void update(int nod,int st,int dr);

int main()
{
    int i,j=1;
    f>>n;
    for(i=1;i<=n;i++){
        f>>v[i]>>intervale[i].cost>>intervale[i].l>>intervale[i].r;
        intervale[i].l=v[i]-intervale[i].l;
        intervale[i].r+=v[i];}
    sort(v+1,v+n+1);
    for(i=1;i<=n;i++){
        intervale[i].l=lower_bound(v+1,v+n+1,intervale[i].l)-v;
        intervale[i].r=upper_bound(v+1,v+n+1,intervale[i].r)-v-1;}
    build_ai(1,1,n);
    sort(intervale+1,intervale+n+1,Comp);
    for(i=1;i<=n;i++){
        mn=INF;
        while(j<=n&&intervale[j].r==i){
            mnq=0;
            if(intervale[j].l-1){
                a=intervale[j].l-1;
                b=intervale[j].r-1;
                mnq=INF;
                query(1,1,n);}
            if(mnq+intervale[j].cost<mn)
                mn=mnq+intervale[j].cost;
            j++;}
        a=i;
        update(1,1,n);}
    g<<mn<<'\n';
    f.close();
    g.close();
    return 0;
}

void build_ai(int nod,int st,int dr){
    ai[nod]=INF;
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    build_ai(2*nod,st,mij);
    build_ai(2*nod+1,mij+1,dr);}

void query(int nod,int st,int dr){
    if(st>=a&&dr<=b){
        if(ai[nod]<mnq)
            mnq=ai[nod];
        return;}
    int mij=(st+dr)/2;
    if(a<=mij)
        query(2*nod,st,mij);
    if(b>mij)
        query(2*nod+1,mij+1,dr);}

void update(int nod,int st,int dr){
    if(st==dr){
        ai[nod]=mn;
        return;}
    int mij=(st+dr)/2;
    if(a<=mij)
        update(2*nod,st,mij);
    else
        update(2*nod+1,mij+1,dr);
    ai[nod]=MIN(ai[2*nod],ai[2*nod+1]);}