Cod sursa(job #2105078)
Utilizator | Data | 12 ianuarie 2018 16:54:19 | |
---|---|---|---|
Problema | Cautare binara | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.54 kb |
#include <fstream>
using namespace std;
int v[100005];
int main()
{
ifstream fin ("cautbin.in");
ofstream fout ("cautbin.out");
int n;
fin>>n;
int i;
for (i=0;i<n;i++) {
fin>>v[i];
}
int m,q,x,d,s,mi;
bool ok;
fin>>m;
for (i=0;i<m;i++) {
fin>>q>>x;
if (q==0) {
d=n-1,s=0;
ok=0;
while (ok==0&&d>=s) {
mi=(d+s)/2;
if (x==19) {
}
if (v[mi]==x) {
ok=1;
}
else if (v[mi]>x) {
d=mi-1;
}
else {
s=mi+1;
}
}
if (ok==1) {
while (v[mi+1]==x&&mi+1<n) {
mi++;
}
fout<<mi+1<<"\n";
}
else {
fout<<-1<<"\n";
}
}
else if (q==1) {
d=n-1,s=0;
ok=0;
while (ok==0&&d>=s) {
mi=(d+s)/2;
if (v[mi]==x) {
ok=1;
}
else if (v[mi]>x) {
d=mi-1;
}
else {
s=mi+1;
}
}
if (ok==1) {
while (v[mi+1]==x&&mi+1<n) {
mi++;
}
fout<<mi+1<<"\n";
}
else {
while (v[d]>x) {
d--;
}
fout<<d+1<<"\n";
}
}
else if (q==2) {
d=n-1,s=0;
ok=0;
while (ok==0&&d>=s) {
mi=(d+s)/2;
if (v[mi]==x) {
ok=1;
}
else if (v[mi]>x) {
d=mi-1;
}
else {
s=mi+1;
}
}
if (ok==1) {
while (v[mi-1]>=x&&mi-1>=0) {
mi--;
}
fout<<mi+1<<"\n";
}
else {
if (v[s]>=x) {
fout<<s+1<<"\n";
}
else {
while (v[s]<x) {
s++;
}
fout<<s+1<<"\n";
}
}
}
}
return 0;
}