Cod sursa(job #1484074)

Utilizator AdrianSLHamod Adrian AdrianSL Data 10 septembrie 2015 14:26:14
Problema Cautare binara Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>

using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int n,a[100],x,m,c;
int st,dr,cmij;
int caut_bin0(int val, int st, int dr, int cmij)
{ int mij,ok=0;
  // if(a[dr]==val)return dr;
   while(st <= dr && ok==0)
    {   if(a[dr]==val)return dr;
        mij=(st+dr)/2;
        if(a[mij]==val)ok=1;
        if(a[mij]<val)st=mij+1;
        else dr= mij-1;
    }

    if(!ok)return -1;
    if(cmij == mij)return mij;
     else{ cmij=mij;
           st=mij;dr=n;
           caut_bin0(val,st,dr,cmij);
         }
}

int caut_bin1(int val, int st, int dr, int cmij)
{ int mij,ok=0;
  // if(a[dr]<=val)return dr;
   while(st <= dr && ok==0)
    {   if(a[dr]<=val)return dr;
        mij=(st+dr)/2;
        if(a[mij]<=val)ok=1;
        if(a[mij]<val)st=mij+1;
        else dr= mij-1;
    }

    if(!ok)return -1;
    if(cmij == mij)return mij;
     else{ cmij=mij;
           st=mij;dr=n;
           caut_bin1(val,st,dr,cmij);
         }
}
int caut_bin2(int val, int st, int dr, int cmij)
{ int mij,ok=0;
 //  if(a[st]>=val)return st;
   while(st <= dr && ok==0)
    {    if(a[st]>=val)return st;
        mij=(st+dr)/2;
        if(a[mij]>=val)ok=1;
        if(a[mij]<val)st=mij+1;
        else dr= mij-1;
    }

    if(!ok)return -1;
    if(cmij == mij)return mij;
     else{ cmij=mij;
           dr=mij;st=1;
           caut_bin2(val,st,dr,cmij);
         }
}






int main()
{
    fin>>n;
    for(int i=1; i<=n; i++)fin>>a[i];
    fin>>m;
    st=1,dr=n,cmij=-1;
    for(int i=1; i<=m ;i++)
    {  fin>>c>>x;
       if(c==0)fout<<caut_bin0(x,st,dr,cmij)<<endl;
       if(c==1)fout<<caut_bin1(x,st,dr,cmij)<<endl;
       if(c==2)fout<<caut_bin2(x,st,dr,cmij)<<endl;

    }

    return 0;
}