Pagini recente » Atasamentele paginii Clasament pregatire_oji2010i | Istoria paginii utilizator/ioni2001 | Profil AlexandraElla | Cod sursa (job #876989) | Cod sursa (job #1001428)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int s[100010];
int len;
void doOp(int op, int param);
int main()
{
int nrOp;
fin >> len;
for(int i=0; i<len; i++)
{
fin >> s[i];
}
fin >> nrOp;
for(int i=0; i<nrOp; i++)
{
int op, param;
fin >> op;
fin >> param;
doOp(op,param);
}
return 0;
}
void doOp(int op, int param)
{
int mid=0,lo=0,hi=0;
switch (op)
{
// cea mai mare pozitie pe care se afla un element cu valoarea x sau -1 daca aceasta valoare nu se gaseste in sir
case 0:
{
lo = 0;
hi = len-1;
mid = 0;
while(lo < hi)
{
int tempMid = mid;
mid = lo + (hi-lo)/2;
if(tempMid == mid){
break;
}
if(s[mid] <= param)
{
lo = mid;
}
else if(s[mid] > param)
{
hi = mid;
}
}
if(s[mid]==param)
cout << mid+1;
else
cout << -1;
break;
}
// cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir. Se garanteaza ca cel mai mic numar al sirului este mai mic sau egal decat x
case 1:
{
lo = 0;
hi = len-1;
mid = 0;
while(lo < hi)
{
int tempMid = mid;
mid = lo + (hi-lo)/2;
if(tempMid == mid){
break;
}
if(s[mid] <= param)
{
lo = mid;
}
else if(s[mid] > param)
{
hi = mid;
}
}
cout << mid+1;
break;
}
// cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir. Se garanteaza ca cel mai mare numar din sir este mai mare sau egal decat x
case 2:
{
lo = 0;
hi = len-1;
mid = 0;
while(lo < hi)
{
int tempMid = mid;
mid = lo + (hi-lo)/2;
if(tempMid == mid){
break;
}
if(s[mid] < param)
{
lo = mid;
}
else if(s[mid] >= param)
{
hi = mid;
}
if(mid != 0){
if(s[mid-1] < param){
break;
}
}
}
cout << mid+1;
break;
}
}
}