Pagini recente » Cod sursa (job #736180) | Cod sursa (job #3138060) | Cod sursa (job #2304483) | Cod sursa (job #1308233) | Cod sursa (job #820421)
Cod sursa(job #820421)
#include<fstream>
using namespace std;
int a[100000],N,i;
ofstream fout("cautbin.out");
ifstream fin("cautbin.in");
int binarySearch(int x){
int mid, hi = N, lo = -1;
while (hi - lo > 1){
mid = lo + (hi - lo)/2;
if(a[mid] < x) lo = mid;
else hi = mid;
}
if(hi == N || a[hi] != x) return -1;
else return hi;
}
void zero(int x){
int tmp;
tmp = binarySearch(x);
if(tmp >= 0){
for(i = 0; i + tmp < N && a[i+tmp] == x; i++);
fout << tmp + i <<"\n";
}
else fout << "-1\n";
}
void one(int x){
int tmp,ok = 0;
tmp = binarySearch(x);
if(tmp >= 0){
for(i = 0; i + tmp < N && a[i+tmp] == x; i++);
fout << tmp + i <<"\n";
}
else{
for(i = x - 1; i >= a[0] && !ok; i--){
tmp = binarySearch(i);
if(tmp > -1){
fout << tmp << "\n";
ok = 1;
}
}
if(!ok) fout << "-1\n";
}
}
void two(int x){
int tmp, ok = 0;
tmp = binarySearch(x);
if(tmp >= 0){
for(i = 0; tmp - i >= 0 && a[tmp - i] == x; i++);
fout << tmp - i + 2<<"\n";
}
else{
for(i = x + 1; i <= a[N-1] && !ok; i++){
tmp = binarySearch(i);
if(tmp > -1){
fout << tmp << "\n";
ok = 1;
}
}
if(!ok) fout << "-1\n";
}
}
int main()
{
int M,i,sType,x;
fin >> N;
for(i = 0 ; i < N; i++){
fin >> a[i];
}
fin >> M;
for(i = 0; i < M; i++){
fin >> sType >> x;
switch(sType){
case 0: zero(x);
break;
case 1: one(x);
break;
case 2: two(x);
break;
default: break;
}
}
fin.close();
fout.close();
return 0;
}