Pagini recente » Cod sursa (job #3001149) | Cod sursa (job #2597160) | Cod sursa (job #932472) | Cod sursa (job #807078) | Cod sursa (job #1752377)
#include <fstream>
using namespace std;
int* ReadVector(int n, ifstream &fin);
void SolveQuerys(int n, int* vect, istream &fin, ostream &fout);
int BinarySearch(int left, int right, int x, int* vect, bool flag);
int main()
{
ifstream fin;
ofstream fout;
fin.open("cautbin.in");
fout.open("cautbin.out");
int n;
fin >> n;
int *vect = ReadVector(n, fin);
SolveQuerys(n, vect, fin, fout);
fin.close();
fout.close();
}
int* ReadVector(int n, ifstream &fin)
{
int *vect = new int[n + 1]();
for (int i = 1; i <= n; i++)
fin >> vect[i];
return vect;
}
void SolveQuerys(int n, int* vect, istream &fin, ostream &fout)
{
int m, opt, x;
fin >> m;
for (int i = 1; i <= m; i++)
{
fin >> opt >> x;
bool flag = opt == 2 ? true : false;
int pos = BinarySearch(1, n, x, vect, flag);
switch (opt)
{
case 0:
if (vect[pos] == x)
fout << pos << "\n";
else
fout << -1 << "\n";
break;
case 1:
fout << pos << "\n";
break;
case 2:
if (vect[pos] == x)
fout << pos << "\n";
else
fout << pos + 1 << "\n";
break;
}
}
}
int BinarySearch(int left, int right, int x, int* vect, bool flag)
{
if (left == right)
return left;
int mid = (left + right) / 2;
if (x < vect[mid] || (x <= vect[mid] && flag))
return BinarySearch(left, mid - 1, x, vect, flag);
if (x == vect[mid] && x != vect[mid + 1])
return mid;
else
return BinarySearch(mid + 1, right, x, vect, flag);
}