Pagini recente » Cod sursa (job #37263) | Cod sursa (job #362562) | Cod sursa (job #3129429) | Cod sursa (job #1437025) | Cod sursa (job #271957)
Cod sursa(job #271957)
#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);
}
}