Cod sursa(job #1476112)

Utilizator pitbull007Hurmuzache Ciprian pitbull007 Data 24 august 2015 14:50:40
Problema Cautare binara Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 2.23 kb
#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;
}