Pagini recente » Cod sursa (job #217950) | Cod sursa (job #938661) | Cod sursa (job #1195607) | Cod sursa (job #1479364) | Cod sursa (job #1476112)
#include <stdio.h>
#include <stdlib.h>
int N;
int A[100000];
int main(void) {
FILE *fin,*fout;
int i,question_n,p_n,el_n,save_step,j,step;
fin=fopen("cautbin.in","r");
fout=fopen("cautbin.out","w");
fscanf(fin,"%d",&N);
for(i=0;i<N;i++) {
fscanf(fin,"%d",&A[i]);
}
fscanf(fin,"%d",&question_n);
for(step=1;step<N;step<<=1);
for(i=0;i<question_n;i++) {
fscanf(fin,"%d",&p_n);
save_step=step;
if(p_n == 0) {
// x - cea mai mare pozitie pe care se afla un element cu valoarea x sau -1
// daca aceasta valoare nu se gaseste in sir
fscanf(fin,"%d",&el_n);
//printf("\nCea mai mare pozitie == x sau -1 ");
for(j=0;save_step;save_step>>=1) {
if(j+save_step<N && A[j+save_step] <= el_n) {
//printf("\nHERE %d\n",save_step);
j+=save_step;
}
}
if(A[j] == el_n) {
//printf("\nHERE %d\n",step);
fprintf(fout,"%d\n",j+1);
}else {
fprintf(fout,"%d\n",-1);
}
} else if(p_n == 1) {
//x - cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir.
//Se garanteaza ca cel mai mic numar al sirului este mai mic sau egal decat x
fscanf(fin,"%d",&el_n);
//printf("\nCea mai mare pozitie <= x ");
for(j=0;save_step;save_step>>=1) {
if(j+save_step<N && A[j+save_step] <= el_n) {
j+=save_step;
}
}
fprintf(fout,"%d\n",j+1);
} else if(p_n == 2) {
//cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir.
//Se garanteaza ca cel mai mare numar din sir este mai mare sau egal decat x
fscanf(fin,"%d",&el_n);
//printf("\nCea mai mica pozitie >= x ");
for(j=N;save_step;save_step>>=1) {
if(j-save_step>0 && A[j-save_step] >= el_n) {
j-=save_step;
}
}
fprintf(fout,"%d\n",j+1);
}
}
fclose(fin);
fclose(fout);
return 0;
}