Cod sursa(job #1584287)

Utilizator netfreeAndrei Muntean netfree Data 29 ianuarie 2016 21:36:05
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.36 kb
#include <iostream>
#include <fstream>
using namespace std;

int x[100001];

int cautare_binara_0 (int x[],int nrDeCautat,int n){
int st=1,dr=n,mijloc=0;int gasit=0,i;
while(st<=dr && gasit==0){
    mijloc=(st+dr)/2;
    if(x[mijloc]==nrDeCautat){
        gasit=mijloc;
    }
    else if (x[mijloc]<nrDeCautat)
                st=mijloc+1;
                else
                dr=mijloc-1;
}
if(gasit!=0){
    for(i=gasit;i<=n;i++){
        if(x[i]==x[gasit])
                gasit=i;
                else break;
                }

    return gasit;

}
else
 return -1;
}

int cautare_binara_1 (int x[],int nrDeCautat,int n){
int st=1,dr=n,mijloc=0;int gasit=0,i;
while(st<=dr && gasit==0){
    mijloc=(st+dr)/2;
    if(x[mijloc]==nrDeCautat){
        gasit=mijloc;
    }
    else if (x[mijloc]<nrDeCautat)
                st=mijloc+1;
                else
                dr=mijloc-1;
}
if(gasit==0)
    return dr;
else{
 for(i=gasit;i<=n;i++){
        if(x[i]==x[gasit])
                gasit=i;
                else break;
                }
    return gasit;
}

}

int cautare_binara_2 (int x[],int nrDeCautat,int n){
int st=1,dr=n,mijloc=0;int gasit=0,i;
while(st<=dr && gasit==0){
    mijloc=(st+dr)/2;
    if(x[mijloc]==nrDeCautat){
        gasit=mijloc;
    }
    else if (x[mijloc]<nrDeCautat)
                st=mijloc+1;
                else
                dr=mijloc-1;
}
if(gasit==0)
    return st;
else{
 for(i=gasit;i>=1;i--){
        if(x[i]==x[gasit])
                gasit=i;
                else break;
                }
    return gasit;
}

}
int main()
{
    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");

    int rezultat,t,q,i,type,mijloc,st,dr,gasit=0,n,nrDeCautat,raspuns;

    fin>>n;
    for(i=1;i<=n;i++)
        fin>>x[i];
    fin>>t;
    for(q=1;q<=t;q++){
        fin>>type;
        fin>>nrDeCautat;
        switch (type){
        case 0:
        fout<<cautare_binara_0(x,nrDeCautat,n)<<"\n";
        break;
        case 1:
        fout<<cautare_binara_1(x,nrDeCautat,n)<<"\n";
        break;
        case 2:
        fout<<cautare_binara_2(x,nrDeCautat,n)<<"\n";
        break;
        }

    }
return 0;
}



/*
int main()
{
    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");

    int rezultat,t,q,i,type,mijloc,st,dr,gasit=0,n,nrDeCautat,raspuns;

    fin>>n;
    for(i=1;i<=n;i++)
        fin>>x[i];


    fin>>t;
    for(q=1;q<=t;q++){
        fin>>type;
        if(type==0){
            fin>>nrDeCautat;
            rezultat=cautare_binara(x,nrDeCautat,n);
                for(i=rezultat+1;i<=n;i++){
                    if(x[i]==x[rezultat])
                        rezultat=i;
                        else break;
                }
                fout<<rezultat<<"\n";

        }
        if(type==1){
            fin>>nrDeCautat;
            cautare_binara_2(x,nrDeCautat,n,dr,st,gasit);
             rezultat=dr;
             for(i=1;i>=1;i--){
                    if(x[i]==x[rezultat])
                        rezultat=i;
                        else break;
                }
            cout<<rezultat<<"\n";
        }
        if(type==2){
            fin>>nrDeCautat;
            cautare_binara_2(x,nrDeCautat,n,dr,st,gasit);
            cout<<x[st];
        }




    }









    return 0;
}
*/