Pagini recente » Cod sursa (job #2118143) | Cod sursa (job #1678838) | Cod sursa (job #1734383) | Cod sursa (job #1088119) | Cod sursa (job #1783511)
//
// main.cpp
// BinarySearch
//
// Created by Cristina Radulescu on 10/18/16.
// Copyright © 2016 Cristina Radulescu. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
int v[100000], N;
int binary_search(int left, int right, int x){
if(left > right)
return -1;
int m = left + (right-left)/2;
if(v[m] == x){
while(m < N && v[m] == v[m+1])
m++;
return m;
}
else if(v[m] > x)
return binary_search(left, m-1, x);
else
return binary_search(m+1, right, x);
}
int upperBound_BS(int left, int right, int x){
if(left > right)
return -1;
int m = left + (right-left)/2;
if( (m < N && v[m] <= x && x < v[m+1]) || (m == N && v[m] <= x) ){
return m;
}
else if(v[m] >= x)
return upperBound_BS(left, m-1, x);
else
return upperBound_BS(m+1, right, x);
}
int lowerBound_BS(int left, int right, int x){
if(left > right)
return -1;
int m = left + (right-left)/2;
if( (m > 1 && v[m] >= x && x > v[m-1]) || (m == 1 && v[m] >= x) ){
return m;
}
else if(v[m] > x)
return lowerBound_BS(left, m-1, x);
else
return lowerBound_BS(m+1, right, x);
}
int main() {
// insert code here...
freopen("cautbin.in", "r", stdin);
freopen("cautbin.out","w", stdout);
int x, queries, type;
cin >> N;
for(int i = 1; i <= N; ++i){
cin >> x;
v[i] = x;
}
cin >> queries;
for(int i = 0; i < queries; ++i){
cin >> type >> x;
if( type == 0)
cout << binary_search(1, N, x) << endl;
else if (type == 1)
cout << upperBound_BS(1, N, x) << endl;
else if(type == 2)
cout << lowerBound_BS(1, N, x) << endl;
}
return 0;
}