Pagini recente » Cod sursa (job #2128602) | Cod sursa (job #2349162) | Cod sursa (job #1159267) | Cod sursa (job #1333537) | Cod sursa (job #530367)
Cod sursa(job #530367)
// http://infoarena.ro/problema/cautbin
#include <fstream>
#include <vector>
using namespace std;
int toBeFound;
vector<int> content;
ifstream in("cautbin.in");
ofstream out("cautbin.out");
int firstSearch(int left,int right);
int secondSearch(int left,int right);
int thirdSearch(int left,int right);
int main() {
int lenght,number,type;
in >> lenght;
for(int i=1;i<=lenght;i++) {
in >> number;
content.push_back(number);
}
in >> lenght; // numarul de interogari
for(int i=1;i<=lenght;i++) {
in >> type >> toBeFound;
switch(type) {
case 0: out << firstSearch(0,content.size()-1) << "\n"; break;
case 1: out << secondSearch(0,content.size()-1) << "\n"; break;
case 2: out << thirdSearch(0,content.size()-1) << "\n"; break;
}
}
return (0);
}
int firstSearch(int left,int right) {
if(left > right)
return -1;
else {
int middle = (left + right) / 2;
if(content[middle] == toBeFound)
// daca nu este ultimul element si urmatorul element indeplineste conditia
if(middle != right && content[middle+1] == toBeFound)
return firstSearch(middle+1,right);
else
return middle+1;
else
if(content[middle] > toBeFound)
return firstSearch(left,middle-1);
else
return firstSearch(middle+1,right);
}
}
int secondSearch(int left,int right) {
int middle = (left + right) / 2;
if(content[middle] <= toBeFound)
// daca nu este ultimul element si urmatorul element indeplineste conditia
if(middle != right && content[middle+1] <= toBeFound)
return secondSearch(middle+1,right);
else
return middle+1;
else
if(content[middle] > toBeFound)
return secondSearch(left,middle-1);
else
return secondSearch(middle+1,right);
}
int thirdSearch(int left,int right) {
int middle = (left + right) / 2;
if(content[middle] >= toBeFound)
// daca nu este primul element si elementul anterior indeplineste conditia
if(middle != left && content[middle-1] >= toBeFound)
return thirdSearch(left,middle-1);
else
return middle+1;
else
if(content[middle] > toBeFound)
return thirdSearch(left,middle-1);
else
return thirdSearch(middle+1,right);
}