Cod sursa(job #1329468)

Utilizator Mihai7Gheoace Mihai Mihai7 Data 29 ianuarie 2015 15:45:04
Problema Cautare binara Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<fstream>
using namespace std;
ofstream g("cautbin.out");
unsigned a[100000],i,n;
int cautbinar(unsigned int key)
{int imax,imin,imid;imax=n-1;imin=0;
while(imin<imax)
{imid=(imax+imin)/2;
if(a[imid]<key)
    imin=imid+1;
    else imax=imid;
}
if(a[imin]==key)
    return imin;
else return -1;
}
inline void valmax(int imid)
{int i=imid;while(a[i]==a[imid]&&i<=n-1)++i;g<<i<<'\n';}
void caut(unsigned int x,unsigned int y)
{int d;d=cautbinar(y);
switch(x){
case 0:
if(d!=-1)
    valmax(d);
    else g<<-1<<'\n';
break;
case 1:
if(d!=-1)
valmax(d);
else {int b=-1;
for(unsigned int j=y-1;j>=a[0]&&b==-1;--j)
     b=cautbinar(j);g<<b+1<<'\n';}
     break;
case 2:
    if(d!=-1)
{int i=d;while(a[i]==a[d]&&i>=0)--i;g<<i+2<<'\n';}
  else {int b=-1;for(int j=y+1;j<=a[n-1]&&b==-1;++j)
     b=cautbinar(j);g<<b+1<<'\n';}
     break;
}
}
int main()
{ifstream f("cautbin.in");

unsigned int m,x,y;
f>>n;
for(i=0;i<n;++i)
    f>>a[i];
f>>m;
for(i=0;i<m;++i)
{f>>x>>y;caut(x,y);}
}