Cod sursa(job #189082)

Utilizator zbarniZajzon Barna zbarni Data 12 mai 2008 00:47:08
Problema Heavy metal Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<fstream.h>
#include<stdlib.h>
#define g 100001
struct list
 {
  long s,f,e;
 };
list a[g];
int sz,c;
int compare (const void *a, const void *b)
 {
  return ((((list*)a)->f) - (((list*)b)->f));
 }

long vissza (int k)
 {
  long j=k+1,r,h=-1;
  c=0;
  r=a[j].f-a[j].s;
  while (k>=0 && r>c)
  {
   if (a[k].e!=-2)
   {
    if (a[k].f<a[j].s)
      { h=k; break; }
    c+=a[k].f-a[k].s;
    k=a[k].e;
   }
  }
  return h;
 }

int main()
 {
  ifstream be ("heavymetal.in");
  ofstream ki ("heavymetal.out");
  long n,i,j,last,u;
  be>>n;
  for (i=0;i<n;i++)
   {  be>>a[i].s>>a[i].f; a[i].e=-2; }
  be.close();
  qsort (a,n,sizeof(list),compare);
  sz=0;
  sz=a[0].f-a[0].s;
  last=0; a[0].e=-1;
  for (i=1;i<n;i++)
    {
     if (a[last].f<=a[i].s)
       {
	a[i].e=last;
	last=i;
	u=a[i].f-a[i].s;
	sz+=a[i].f-a[i].s;
       }
     else
      {
       if (a[i].f-a[i].s>u)
	 {
	  j=vissza(i-1);
	  if (j!=-1)
	   {
	    a[i].e=j;
	    sz-=c;
	    sz+=a[i].f-a[i].s;
	   }
	 }
      }
    }
  ki<<sz<<'\n';
  ki.close();
  return 0;
 }