Cod sursa(job #2971021)

Utilizator TghicaGhica Tudor Tghica Data 26 ianuarie 2023 12:11:09
Problema Stalpi Scor 60
Compilator cpp-64 Status done
Runda sa_fac_schema Marime 2.05 kb
#include <fstream>
#include <algorithm>

#define NMAX 100'000
#define INF 2100000000

using namespace std;

ifstream cin("stalpi.in");
ofstream cout("stalpi.out");

struct stalp{
  int x, c, s, d;
}v[NMAX + 1];

bool cmp(stalp a, stalp b) {
  return a.x < b.x;
}

int aint[NMAX * 4], cost[NMAX + 1], ok;

void update(int p, int lInt, int rInt, int target, int x) {
  if(lInt == rInt) {
    if(ok)
      aint[p] = min(x, aint[p]);
    else
      aint[p] = x;
    return;
  }

  int med = (lInt + rInt) / 2, aux;

  if(lInt <= target && target <= med) {
    update(p * 2, lInt, med, target, x);
  } else {
    update(p * 2 + 1, med + 1, rInt, target, x);
  }
  aint[p] = min(aint[p * 2], aint[p * 2 + 1]);
}

int query(int p, int lInt, int rInt, int lTarget, int rTarget) {
  if(lTarget <= lInt && rInt <= rTarget) {
    return aint[p];
  }

  int med = (lInt + rInt) / 2, mn = INF;

  if(lTarget <= med) {
    mn = query(p * 2, lInt, med, lTarget, rTarget);
  }
  if(med + 1 <= rTarget) {
      mn = min(query(p * 2 + 1, med + 1, rInt, lTarget, rTarget), mn);
  }
  return mn;
}

int main() {
  int n, i, st, dr, mij, last;
  cin>>n;
  for(i = 1; i <= n; i++) {
    cin>>v[i].x>>v[i].c>>v[i].s>>v[i].d;
    update(1, 0, n, i, INF);
  }
  ok = 1;
  sort(v + 1, v + n + 1, cmp);
  for(i = 1; i <= n; i++) {
    last = i;
    st = 1;
    dr = i;
    while(st <= dr) {
      mij = (st + dr) / 2;
      if(v[mij].x < v[i].x - v[i].s) {
        st = mij + 1;
      } else {
        last = mij;
        dr = mij - 1;
      }
    }
    v[i].s = last;

    last = i;
    st = i;
    dr = n;
    while(st <= dr) {
      mij = (st + dr) / 2;
      if(v[mij].x <= v[i].d + v[i].x) {
        st = mij + 1;
        last = mij;
      } else {
        dr = mij - 1;
      }
    }
    v[i].d = last;
  }
  for(i = 1; i <= n; i++) {
    int costMin = query(1, 0, n, v[i].s - 1, n);
    if(v[i].x == 1)
      costMin = 0;
    update(1, 0, n, v[i].d, costMin + v[i].c);
  }
  cout<<query(1, 0, n, n, n);
  return 0;
}