Cod sursa(job #271957)

Utilizator igsifvevc avb igsi Data 6 martie 2009 10:14:25
Problema Secventa Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<fstream.h>

#define xx 500001

ifstream fin("secventa.in");
ofstream fout("secventa.out");

int p[xx],n,k,maxb,pi,pf;
struct heap { int ind,x; } h[xx];

inline void schimba(int i,int j)
{
     int aux;
     aux=p[h[i].ind];
     p[h[i].ind]=p[h[j].ind];
     p[h[j].ind]=aux;
     
     aux=h[i].x;
     h[i].x=h[j].x;
     h[j].x=aux;
}

void sus(int i);
void jos(int i);
int min(int i);
void modifica(int i);

int main()
{
    fin>>n>>k;
    int i,x;
    
    for(i=1;i<=k;i++)
    {  
      fin>>h[i].x;
      h[i].ind=i;
      p[i]=i;
      sus(i);
    }
    
    pi=1;
    pf=k;
    maxb=-31000;
    
    for(i=k+1;i<=n+1;i++)
    {
      x=min(i);
      if(x>maxb)
      {
         maxb=x;
         pf=i-1;
         pi=i-k;
      }
    }
    
    fout<<pi<<' '<<pf<<' '<<maxb<<'\n';
    fout.close();
    return 0;
}

int min(int i)
{
    int w,q=h[1].x;
    
    if(i!=n+1)
    {
      fin>>w;
      h[p[i-k]].x=w;
      h[p[i-k]].ind=i;
      p[i]=p[i-k];
      sus(p[i]);
      jos(p[i]);
    }
    return q;
}      

void sus(int i)
{
     int q=i/2;
     
     if(q && h[i].x<h[q].x)
     {
          schimba(i,q);
          sus(q);
     }
}

void jos(int i)
{
     int min=-1;
     if(2*i<=k && 2*i+1<=k && (h[i].x>h[2*i].x || h[i].x>h[2*i+1].x))
        min=(h[2*i].x<h[2*i+1].x ? 2*i : 2*i+1);
     else
       if(2*i<=k && 2*i+1>k && h[2*i].x<h[i].x)
           min=2*i;
     
     if(min!=-1)
     {
        schimba(min,i);
        jos(min);
     }
}