Pagini recente » Cod sursa (job #350264) | Cod sursa (job #877190) | Cod sursa (job #2942065) | Cod sursa (job #1229522) | Cod sursa (job #2462400)
#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 SearchLeft(int &in, int &mid, int &sf) {
sf = mid;
mid = (in+sf)/2;
}
void SearchRight(int &in, int &mid, int &sf) {
in = mid;
mid = (in+sf)/2;
}
int Find0(int val) {
in = 1;
sf = n;
mid = (in+sf)/2;
rasp = -1;
///cout << in << ' ' << mid << ' ' << sf << '\n';
while(in != sf) {
if(v[mid] == val) {
if(in != mid) {
rasp = mid;
SearchRight(in, mid, sf);
}
else
SearchLeft(in, mid, sf);
} else if(v[mid] < val) {
if(in != mid)
SearchRight(in, mid, sf);
else
SearchLeft(in, mid, sf);
}
else if(v[mid] > val)
SearchLeft(in, mid, sf);
if(v[mid] == val)
rasp = mid;
///cout << in << ' ' << mid << ' ' << sf << '\n';
}
return rasp;
}
int Find1(int val) {
in = 1;
sf = n;
mid = (in+sf)/2;
rasp = -1;
///cout << in << ' ' << mid << ' ' << sf << '\n';
while(in != sf) {
if(v[mid] <= val) {
rasp = mid;
if(in != mid)
SearchRight(in, mid, sf);
else {
mid += 1;
SearchRight(in, mid, sf);
if(v[mid] <= val)
rasp = mid;
}
} else if(v[mid] > val) {
if(sf != mid)
SearchLeft(in, mid, sf);
else {
mid -= 1;
SearchRight(in, mid, sf);
}
}
if(v[mid] <= val)
rasp = mid;
///cout << in << ' ' << mid << ' ' << sf << '\n';
}
return rasp;
}
int Find2(int val) {
in = 1;
sf = n;
mid = (in+sf)/2;
rasp = -1;
///cout << in << ' ' << mid << ' ' << sf << '\n';
while(in != sf) {
if(v[mid] >= val) {
rasp = mid;
SearchLeft(in, mid, sf);
} else if(v[mid] < val) {
if(in != mid) {
SearchRight(in, mid, sf);
} else {
mid += 1;
SearchRight(in, mid, sf);
if(v[mid] >= val)
rasp = mid;
}
}
///cout << in << ' ' << mid << ' ' << sf << '\n';
}
return rasp;
}
int main()
{
f >> n;
for(i = 1; i <= n; i++) {
f >> v[i];
///cout << v[i] << ' ';
}
///cout << '\n';
f >> m;
for(i = 1; i <= m; i++) {
f >> c >> val;
///cout << i << '\n';
if(c == 0)
rasp = Find0(val);
else if(c == 1)
rasp = Find1(val);
else if(c == 2)
rasp = Find2(val);
g << rasp << '\n';
///cout << '\n';
}
return 0;
}