Cod sursa(job #1761712)

Utilizator dodecagondode cagon dodecagon Data 22 septembrie 2016 19:19:35
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <stdio.h>

int n,m,i,j,k,a[100009],p;

const int buff_size=4096;
char buff[buff_size];
int _i=buff_size;

int next_int(FILE * in)
{
    char x;
    int z=0;
   
   if (_i==buff_size)
    fread(buff,buff_size,1,in),_i=0;
      
     x=1;
 
      while (x<48 || x> 57)
         {  
         	x=buff[_i];
         	_i++;
         	if (_i==buff_size)
         		 {
         		 	fread(buff,buff_size,1,in);
         		 	_i=0;
         		 }
         }
 
      while (x>=48 && x<=57)
      {
        z=(z<<1)+(z<<3)+x-48;
        x=buff[_i];
        _i++;
         if (_i==buff_size)
         	 {
               fread(buff,buff_size,1,in);
               _i=0;
             }
      }
 
    return z;
}



int b1(int x)
{
	int i,pp;
	for (i=0,pp=p; pp ; pp>>=1)
    	if (i+pp<n && a[i+pp]<=x)
    		 i+=pp;
    return i;
}

int b2(int x)
{
	int i,pp;
	for (i=n,pp=p; pp ; pp>>=1)
    	if (i-pp>=0 && a[i-pp]>=x)
    		 i-=pp;
    return i;
}




int main(int argc, char const *argv[])
{
    FILE * in = fopen("cautbin.in","r");
    FILE * out= fopen("cautbin.out","w");


    n=next_int(in);

    for (p=1;p<=n;p<<=1) ;

    for (i=0;i<n;++i)
    	a[i]=next_int(in);

    m=next_int(in);

    while (m--)
    {
    	i=next_int(in);
    	j=next_int(in);

    	 
    	if (i==0) 
    	{
    		i=b1(j);
    		if (a[i]==j)
    			fprintf(out, "%d\n",i+1); else 
    		    fprintf(out,"-1\n");
    	} else 
    	{
	    	if (i==1)
	    		fprintf(out,"%d\n",b1(j)+1); else 
	    	if (i==2) 
	    		fprintf(out,"%d\n",b2(j)+1);
        }

    }

  
   fclose(in);
   fclose(out);

	return 0;
}