Cod sursa(job #608574)

Utilizator RuxyRezidentTMRuxandra P RuxyRezidentTM Data 17 august 2011 13:33:27
Problema Cautare binara Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include<cstdio>
using namespace std;

FILE *f,*g;

int n;
int cautare(int ls, int ld, int x, int v[100050])
{ 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[100050])
{ 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&&m+1!=n) return m;
		 if(v[m]<=x&&m+1==n) return m;
	   }
 return -1;
}

int cautare_2(int ls, int ld, int x, int v[100050])
{ int m;
  m=ls+(ld-ls)/2;
  if(v[m]<=x&&v[m+1]>=x) return m+1;
  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) return m-1;
		 if(v[m]<x&&v[m+1]>=x&&m+1!=n) return m;
	   }
 return -1;
}

int main()
{ int v[100050],m,i,x,p,fl;
  f=fopen("cautbin.in","r");
  g=fopen("cautbin.out","w");
  fscanf(f,"%d",&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,"%d",&x);
	         if(x>v[n-1]) fprintf(g,"%d\n",n);
		     else {
				 p=cautare_1(0,n-1,x,v);
                 while(v[p]==v[p+1])
                         p++;
			     fprintf(g,"%d\n",++p);
			      }
             break;
     case 2: fscanf(f,"%d",&x);
			 if(x<v[0]) fprintf(g,"1\n");
			 else {
		        p=cautare_2(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;
}