Pagini recente » Statistici Taraciuc Andrei (Onyxcobra) | Istoria paginii utilizator/alexdobrin911 | Diferente pentru probleme-de-taietura intre reviziile 96 si 70 | Istoria paginii utilizator/ashura | Cod sursa (job #539056)
Cod sursa(job #539056)
#include "stdio.h"
int v[100000];
int cauta_bin(int *v, int n, int opt, int x)
{
int st,dr;
int keep = -2;
int mkeep = -2;
st = 0;
dr = n-1;
if(v == NULL)
{
return -1;
}
switch(opt)
{
case 0:
{
while(st<=dr)
{
if(v[(st+dr)/2]== x)
{
keep = (st+dr)/2;
st = (st+dr)/2 + 1;
continue;
}
if(v[(st+dr)/2]> x)
{
dr = (st+dr)/2 - 1;
continue;
}
if(v[(st+dr)/2]< x)
{
st = (st+dr)/2 + 1;
continue;
}
}
return keep;
}
break;
case 1:
{
while(st<=dr)
{
if(v[(st+dr)/2]== x)
{
keep = (st+dr)/2;
st = (st+dr)/2 + 1;
continue;
}
if(v[(st+dr)/2]> x)
{
dr = (st+dr)/2 - 1;
continue;
}
if(v[(st+dr)/2]< x)
{
mkeep = (st+dr)/2;
st = (st+dr)/2 + 1;
continue;
}
}
if(keep != -2)
{
return keep;
}
else
{
return mkeep;
}
}
break;
case 2:
{
while(st<=dr)
{
if(v[(st+dr)/2]== x)
{
keep = (st+dr)/2;
dr = (st+dr)/2 - 1;
continue;
}
if(v[(st+dr)/2]> x)
{
mkeep = (st+dr)/2;
dr = (st+dr)/2 - 1;
continue;
}
if(v[(st+dr)/2]< x)
{
st = (st+dr)/2 + 1;
continue;
}
}
if(keep != -2)
{
return keep;
}
else
{
return mkeep;
}
}
break;
}
return -2;
}
int main()
{
FILE *f,*g;
int n,m,opt,x;
int i=0;
int rez;
f = fopen("cautbin.in","r");
g = fopen("cautbin.out","w");
fscanf(f,"%d ",&n);
while(i<n)
{
fscanf(f,"%d ",&v[i]);
i++;
}
fscanf(f,"%d ",&m);
i = 0;
while(i<m)
{
fscanf(f,"%d %d ", &opt, &x);
rez = cauta_bin(v, n, opt, x);
fprintf(g,"%d \n", rez+1);
i++;
}
fclose(f);
fclose(g);
return 0;
}