Pagini recente » Cod sursa (job #2547422) | Cod sursa (job #763246) | Cod sursa (job #1478803) | Cod sursa (job #2557185) | Cod sursa (job #1677817)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
std::ifstream in("cautbin.in");
std::ofstream out("cautbin.out");
int CautaBinar(std::vector<int> &vec, int &elem, int low, int high)
{
// conditia de oprire
if(low > high)
{
return -1;
}
int mid = low + (high - low) / 2;
if(vec[mid] == elem)
{
return mid;
}
if(vec[mid] > elem)
{
return CautaBinar(vec, elem, low, mid - 1);
}
else
{
return CautaBinar(vec, elem, mid + 1, high);
}
}
int CautaBinar1(std::vector<int> &vec, int &elem, int low, int high)
{
int mid = low + (high - low) / 2;
while(high > low)
{
mid = low + (high - low) / 2;
if(vec[mid] > elem)
{
high = mid;
}
else
{
low = mid + 1;
}
}
return low;
}
int CautaBinar2(std::vector<int> &vec, int &elem, int low, int high)
{
int mid = low + (high - low) / 2;
while(low <= high)
{
mid = low + (high - low) / 2;
if(vec[mid] >= elem)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return (low - 1) < 0 ? -1 : low - 1;
}
void getRequests(std::vector<int> &vec, std::pair<int , int> &p, int &dimVec)
{
int poz;
if(p.first == 0)
{
poz = CautaBinar(vec, p.second, 0, dimVec - 1);
if(poz == -1)
{
out << -1 << "\n";
return;
}
// in output vectorul este contorizat de la 1 la n
int k = poz;
while(vec[k + 1] == vec[poz])
{
++k;
}
out << k + 1 << "\n";
}
else if(p.first == 1)
{
poz = CautaBinar1(vec, p.second, 0, dimVec - 1);
//std::cout << "Pozitia este : " << poz << "\n";
out << poz << "\n";
}
else
{
//std::cout << p.first << "\n";
poz = CautaBinar2(vec, p.second, 0, dimVec - 1);
//std::cout << "Pozitia este : " << poz << "\n";
out << poz + 1 << "\n";
}
}
int main(void)
{
int dimVec;
in >> dimVec;
std::vector<int> vec;
int elem;
for(int i = 0; i < dimVec; i++)
{
in >> elem;
vec.push_back(elem);
}
int requests;
in >> requests;
// first -> tipul cererii
// second -> numarul pe cerere
std::vector < std::pair <int, int> > v;
int type;
int number;
for(int i = 0; i < requests; i++)
{
in >> type;
in >> number;
std::pair <int, int> p(type, number);
v.push_back(p);
}
for(int i = 0; i < requests; i++)
{
getRequests(vec, v[i], dimVec);
}
}