Pagini recente » Cod sursa (job #2373355) | Cod sursa (job #468949) | Cod sursa (job #209012) | Cod sursa (job #2594452) | Cod sursa (job #2462409)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");
#define MAX_SIZE 100010
int n, m, i, j, c, val, rasp, in, sf, mid;
int v[MAX_SIZE];
void Initializare(){
in = 1;
sf = n;
mid = (in+sf)/2;
rasp = -1;
}
void SearchLeft() {
sf = mid;
mid = (in+sf)/2;
}
void SearchRight() {
in = mid;
mid = (in+sf)/2;
}
int Find0(int val) {
Initializare();
while(in != sf) {
if(v[mid] == val) {
if(in != mid) {
rasp = mid;
SearchRight();
}
else
SearchLeft();
} else if(v[mid] < val) {
if(in != mid)
SearchRight();
else
SearchLeft();
}
else if(v[mid] > val)
SearchLeft();
}
return rasp;
}
int Find1(int val) {
Initializare();
while(in != sf) {
if(v[mid] <= val) {
rasp = mid;
if(in != mid)
SearchRight();
else {
mid += 1;
SearchRight();
if(v[mid] <= val)
rasp = mid;
}
} else if(v[mid] > val) {
if(sf != mid)
SearchLeft();
else {
mid -= 1;
SearchRight();
}
}
}
return rasp;
}
int Find2(int val) {
Initializare();
while(in != sf) {
if(v[mid] >= val) {
rasp = mid;
SearchLeft();
} else if(v[mid] < val) {
if(in != mid) {
SearchRight();
} else {
mid += 1;
SearchRight();
if(v[mid] >= val)
rasp = mid;
}
}
}
return rasp;
}
int main()
{
f >> n;
for(i = 1; i <= n; i++)
f >> v[i];
f >> m;
for(i = 1; i <= m; i++) {
f >> c >> val;
if(c == 0)
rasp = Find0(val);
else if(c == 1)
rasp = Find1(val);
else if(c == 2)
rasp = Find2(val);
g << rasp << '\n';
}
return 0;
}