Cod sursa(job #140331)

Utilizator razvanelu99Razvan Andrus razvanelu99 Data 21 februarie 2008 19:22:57
Problema Secventa Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include<fstream.h>
//#include<conio.h>
struct nr
      {
      int num;
      long poz;
      };
void recons(int n,int i,nr v[500005])
{
int max,st,dr;
st=2*i;
dr=2*i+1;
max=i;
if (v[st].num>v[i].num&&st<=n) max=st;
if (v[dr].num>v[max].num&&dr<=n) max=dr;
if (max!=i)
  {
  nr aux;
  aux=v[i];
  v[i]=v[max];
  v[max]=aux;
  recons(n,max,v);
  }
}
int main()
{
int i;
long m,n,k;
nr v[500005];
int a[500005];
ifstream f("secventa.in");
ofstream g("secventa.out");
f>>n>>k;
m=n;
for (i=1;i<=n;i++) {f>>v[i].num;a[i]=v[i].num;v[i].poz=i;}
for (i=n/2;i>=1;i--) recons (n,i,v);
for (i=m;i>=2;i--)
   {
   nr aux;
   aux=v[i];
   v[i]=v[1];
   v[1]=aux;
   n--;
   recons(n,1,v);
   }
//for (i=1;i<=m;i++) g<<v[i].num<<' ';
//g<<endl;
//for (i=1;i<=m;i++) g<<v[i].poz<<' ';
n=m;
a[n+1]=a[n];
a[0]=a[1];
long z;
long scos=k-1;
for (z=n-1;z>=1;z--)
   {
   if (v[z].num!=v[z+1].num) scos--;
   if (scos==0) break;
   }
long x,in=500002,sf=500002,b,po,dr,st;
for (x=z;x>=1;x--)
   {
   po=v[x].poz;
   dr=v[x].poz;
   st=v[x].poz;
   while (st>=2&&a[st-1]>=a[po]) st--;
   if (st==2&&a[po]<=a[1]) st--;
   while (dr<=n-1&&dr-st<k-1&&a[po]<=a[dr+1]) dr++;
   if (dr==n-1&&a[po]<=a[dr+1]) dr++;
   if (dr-st>=k-1)
     {
     in=st;
     sf=dr;
     b=po;
     break;
     }
   }
x--;
while (v[x].num==a[b])
     {
     po=v[x].poz;
     dr=v[x].poz;
     st=v[x].poz;
     while (st>=2&&a[st-1]>=a[po]) st--;
     if (st==2&&a[po]<=a[1]) st--;
     while (dr<=n-1&&dr-st<k-1&&a[po]<=a[dr+1]) dr++;
      if (dr==n-1&&a[po]<=a[dr+1]) dr++;
     if (dr-st>=k-1)
       if ((st<in)||(st==in&&dr<sf))
	 {
	 in=st;
	 sf=dr;
	 b=po;
	 }
     x--;
     }
g<<in<<' '<<sf<<' '<<a[b];

f.close();
g.close();
return 0;
}