Cod sursa(job #608512)

Utilizator RuxyRezidentTMRuxandra P RuxyRezidentTM Data 17 august 2011 00:12:56
Problema Cautare binara Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<cstdio>
using namespace std;

FILE *f,*g;

int cautare(int ls, int ld, int x, int v[100010])
{ int m;
  m=ls+(ld-ls)/2;
  if(v[m]==x) return m;
  else while(ls<ld)
       { if(x<v[m]) ld=m-1;
         else ls=m+1;
		 m=ls+(ld-ls)/2;
		 if(v[m]==x) return m;
	   }
  return -1;
}

int cautare_1(int ls, int ld, int x, int v[100010])
{ int m;
  m=ls+(ld-ls)/2;
  if(v[m]<=x&&v[m+1]>=x) return m;
  else while(ls<ld)
       { if(x>v[m]) ls=m+1;
         else if(x<v[m]) ld=m-1;  
		 m=ls+(ld-ls)/2;
		 if(v[m]<=x&&v[m+1]>=x) return m;
	   }
 return -1;
}

int main()
{ int v[100010],n,m,i,x,p,fl;
  f=fopen("cautbin.in","r");
  g=fopen("cautbin.out","w");
  fscanf(f,"%d\n",&n);
  for(i=0;i<n;i++)
	fscanf(f,"%d",&v[i]);
  fscanf(f,"%d",&m);
  for(i=0;i<m;i++)
   { fscanf(f,"%d",&fl);
     switch(fl) {
     case 0: fscanf(f,"%d",&x);
		     p=cautare(0,n-1,x,v);
             if(p==-1) fprintf(g,"-1\n");
             else { while(v[p]==v[p+1])
                         p++;
                    fprintf(g,"%d\n",++p);
                  }
             break;
     case 1: fscanf(f,"%u",&x);
		     p=cautare_1(0,n-1,x,v);
             while(v[p]==v[p+1])
                         p++;
			 fprintf(g,"%u\n",++p);
             break;
     case 2: fscanf(f,"%u",&x);
		     p=cautare_1(0,n-1,x,v)+1;
             while(v[p]==v[p-1])
                         p--;
			 fprintf(g,"%d\n",++p);
             break;
     }
   }
  fclose(f); fclose(g);
  return 0;
}