Cod sursa(job #470339)

Utilizator lianaliana tucar liana Data 13 iulie 2010 13:08:10
Problema Gardieni Scor 10
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.61 kb
program gardieni;
type element=record
  inc, sf, pr:longint;
end;
var f, g:text;
    n, t, s, upr, nr, sf:longint;
    v:array[1..50005] of element;

procedure citire;
var i:longint;
  begin
    readln(f,n,t);
    for i:=1 to n do
      read(f,v[i].inc,v[i].sf,v[i].pr);
  end;

function pozitionare(i,j:longint):longint;
var x:element;
  begin
    x:=v[i];
    while i<j do
      begin
        while (j>i) and (v[j].inc>=x.inc) do
          j:=j-1;
        v[i]:=v[j];
        while (i<j) and (v[i].inc<=x.inc) do
          i:=i+1;
        v[j]:=v[i];
      end;
   v[i]:=x;
   pozitionare:=i;
  end;

procedure Qsort(st,dr:longint);
var m:longint;
  begin
    m:=pozitionare(st,dr);
    if st<m-1 then
      Qsort(st,m-1);
    if m+1<dr then
      Qsort(m+1,dr);
  end;

procedure rezolvare;
var i, j:longint;
  begin
    for i:=1 to n do
      if v[i].inc<=v[i].sf then
        begin
          s:=s+(v[i].sf-v[i].inc+1)*v[i].pr;
          sf:=v[i].sf;
        {  s:=s+(v[i].sf-v[i].inc+1)*v[i].pr;}
          upr:=v[i].pr;
          j:=i+1;
          while (v[j].inc<=sf) and (j<=n) do
            begin
              nr:=sf-v[j].inc+1;
              if v[j].pr<upr then
                begin
                  s:=s-nr*upr+nr*v[j].pr;
                  upr:=v[j].pr;
                end;
              v[j].inc:=v[i].sf+1;
              j:=j+1;
            end;
        end;
     writeln(g,s);
  end;

  begin
    assign(f,'gardieni.in'); reset(f);
    assign(g,'gardieni.out'); rewrite(g);
    citire;
    qsort(1,n);
    rezolvare;
    close(f);
    close(g);
  end.