Pagini recente » Cod sursa (job #1103539) | Cod sursa (job #472829) | Cod sursa (job #3281441) | Cod sursa (job #3288894) | Cod sursa (job #2989336)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int lowerBound(vector<int> elements, int left, int right, int value);
int upperBound(vector<int> elements, int left, int right, int value);
int main(){
int arraySize, queryCount;
vector<int> elements;
fin >> arraySize;
elements.resize(arraySize);
for(int i = 0; i < elements.size(); i++)
fin >> elements[i];
fin >> queryCount;
for(int i = 0, queryType, queryValue, indexFound; i < queryCount; i++){
fin >> queryType >> queryValue;
if(queryType == 0){
indexFound = upperBound(elements, 0, elements.size(), queryValue);
if(indexFound > 0 && elements[indexFound - 1] == queryValue)
fout << (indexFound - 1) + 1 << '\n';
else
fout << "-1\n";
}else if(queryType == 1){
indexFound = upperBound(elements, 0, elements.size(), queryValue);
fout << (indexFound - 1) + 1 << '\n';
}else if(queryType == 2){
indexFound = lowerBound(elements, 0, elements.size(), queryValue);
fout << indexFound + 1 << '\n';
}
}
return 0;
}
int lowerBound(vector<int> elements, int left, int right, int value){
int middle, indexFound = elements.size() - 1;
while(left <= right){
middle = (left + right) / 2;
if(value <= elements[middle]){
indexFound = middle;
right = middle - 1;
}else{
left = middle + 1;
}
}
return indexFound;
}
int upperBound(vector<int> elements, int left, int right, int value){
int middle, indexFound = elements.size() - 1;
while(left <= right){
middle = (left + right) / 2;
if(value < elements[middle]){
indexFound = middle;
right = middle - 1;
}else{
left = middle + 1;
}
}
return indexFound;
}