Cod sursa(job #2758825)
Utilizator | Data | 13 iunie 2021 10:46:39 | |
---|---|---|---|
Problema | Cautare binara | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 3.75 kb |
#include <stdio.h>
#include <stdlib.h>
int v[100001];
int main() {
FILE *fin,*fout;
fin=fopen("cautbin.in","r");
fout=fopen("cautbin.out","w");
int n,m,i,last,x,st,dr,tip,poz,mij,ultim;
fscanf(fin,"%d",&n);
for(i=0; i<n; i++) {
fscanf(fin,"%d",&v[i]);
ultim=v[i];
}
fscanf(fin,"%d",&m);
for(i=0; i<m; i++) {
last=-1;
fscanf(fin,"%d%d",&tip,&x);
if(tip==0) {
st=0;
dr=n;
while(st<=dr) {
mij=(st+dr)/2;
if(v[mij]<x)
st=mij+1;
else if(v[mij]>x)
dr=mij-1;
else {
last=mij;
st=mij+1;
}
}
if(last!=-1)
fprintf(fout,"%d\n",last+1);
else
fprintf(fout,"-1\n");
} else if(tip==1) {
if(ultim>=x) {
st=0;
dr=n;
while(st<=dr) {
mij=(st+dr)/2;
if(v[mij]<x)
st=mij+1;
else if(v[mij]>x)
dr=mij-1;
else {
last=mij;
st=mij+1;
}
}
if(last!=-1)
fprintf(fout,"%d\n",last+1);
else {
st=0;
dr=n;
while(st<=dr) {
mij=(st+dr)/2;
if(v[mij]<x) {
last=mij;
st=mij+1;
} else if(v[mij]>x)
dr=mij-1;
}
x=v[last];
st=0;
dr=n;
while(st<=dr) {
mij=(st+dr)/2;
if(v[mij]<x)
st=mij+1;
else if(v[mij]>x)
dr=mij-1;
else {
last=mij;
st=mij+1;
}
}
fprintf(fout,"%d\n",last+1);
}
}
else
fprintf(fout,"%d\n",n);
} else if(tip==2) {
st=0;
dr=n;
while(st<=dr) {
mij=(st+dr)/2;
if(v[mij]<x) {
st=mij+1;
} else if(v[mij]>x)
dr=mij-1;
else {
last=mij;
dr=mij-1;
}
}
if(last!=-1)
fprintf(fout,"%d\n",last+1);
else {
st=0;
dr=n;
while(st<=dr) {
mij=(st+dr)/2;
if(v[mij]<x) {
st=mij+1;
} else if(v[mij]>x) {
last=mij;
dr=mij-1;
}
}
x=v[last];
st=0;
dr=n;
while(st<=dr) {
mij=(st+dr)/2;
if(v[mij]<x) {
st=mij+1;
} else if(v[mij]>x)
dr=mij-1;
else {
last=mij;
dr=mij-1;
}
}
fprintf(fout,"%d\n",last+1);
}
}
}
fclose(fin);
fclose(fout);
return 0;
}