Pagini recente » Cod sursa (job #1905851) | Cod sursa (job #1867796) | Cod sursa (job #15891) | Cod sursa (job #2438925) | Cod sursa (job #942428)
Cod sursa(job #942428)
#include <fstream>
#include <limits>
using namespace std;
long v[100001];
ifstream in("cautbin.in");
ofstream out("cautbin.out");
long binary_search(long x,long ls,long ld);
long search_exact(long x,long ld);
long search_less(long x,long ld);
long search_greater(long x,long ld);
int main()
{
long n,a,b,m,c;
in>>n;
in.ignore(numeric_limits<streamsize>::max(),'\n');
for(int i=0;i<n;++i)
{
in>>v[i];
}
in>>m;
in.ignore(numeric_limits<streamsize>::max(),'\n');
for(int i=0;i<m;++i)
{
in>>a>>b;
in.ignore(numeric_limits<streamsize>::max(),'\n');
switch (a)
{
case 0:
c=search_exact(b,n-1);
break;
case 1:
c=search_greater(b,n-1);
break;
case 2:
c=search_less(b,n-1);
break;
default:
return 0;
}
out<<c<<'\n';
}
in.close();
out.close();
return 0;
}
long binary_search(long x,long ls,long ld)
{
if (ls>ld) return -1;
int mid=(ls+ld)/2;
if (x==v[mid])
return mid;
if (x<v[mid])
return binary_search(x,ls,mid-1);
return binary_search(x,mid+1,ld);
}
long search_less(long x,long ld)
{
int poz=binary_search(x,0,ld);
for(int i=poz-1;i>=0;--i)
if (v[i]<v[poz]) return i+1;
return -1;
}
long search_greater(long x,long ld)
{
int poz=binary_search(x,0,ld);
for(int i=poz+1;i<=ld;++i)
if (v[i]>v[poz]) return i+1;
return -1;
}
long search_exact(long x,long ld)
{
int poz=binary_search(x,0,ld);
if(poz==-1)
return -1;
for(int i=poz+1;i<=ld;++i)
if (v[i]>v[poz]) return i;
return -1;
}