Cod sursa(job #1260144)

Utilizator CalinCojoFMI Cojocaru Calin George CalinCojo Data 10 noiembrie 2014 22:13:31
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include <fstream>
using namespace std;
int main()
{
    int n,m,i,caz,x,left=1,right,mid,negasit=0;
    int v[100];
    ifstream f("cautbin.in",ios::in);
    ofstream g("cautbin.out",ios::out);
    f>>n;
    right=n;
    for(i=1;i<=n;i++){
        f>>v[i];
    }
    f>>m;
    while(m){
        f>>caz>>x;
        if(caz==0){
            left=1;right=n;negasit=0;
            mid=left+(right-left)/2;
            while(v[mid]!=x){
                if(x<v[mid]){
                    right=mid;
                    mid=left+(right-left)/2;
                }
                else{
                    left=mid;
                     mid=left+(right-left)/2+1;
                }
                if(mid==n&&v[n]!=x){
                    negasit=1;
                    break;
                }
                if(mid==1&&v[1]!=x){
                    negasit=1;
                    break;
                }
            }
            if(negasit){
                g<<"-1"<<"\n";
            }
            else{
                while(v[mid+1]==x){
                    mid++;
                }
                g<<mid<<"\n";
            }
        }
        if(caz==1){
        left=1;right=n;negasit=0;
        mid=left+(right-left)/2;
        while(v[mid]!=x){
            if(x<=v[mid]){
                right=mid;
                mid=left+(right-left)/2;
            }
            else{
                left=mid;
                mid=left+(right-left)/2+1;
            }
            if(mid==n&&v[n]!=x){
                while(v[n-1]==v[n]){
                    n--;
                    mid--;
                }
                mid--;
                break;
            }
        }
        while(v[mid]==v[mid+1]){
            mid++;
        }
        g<<mid<<"\n";
    }
    if(caz==2){
        left=1;right=n;negasit=0;
        mid=left+(right-left)/2;
        while(v[mid]!=x){
            if(x<=v[mid]){
                right=mid;
                mid=left+(right-left)/2;
            }
            else{
                left=mid;
                mid=left+(right-left)/2+1;
            }
        if(mid==1&&v[1]!=x){
            mid++;
            while(v[mid]==v[mid+1]){
                mid++;
            }
            break;
        }
    }
    while(v[mid]==v[mid-1]){
        mid--;
    }
        g<<mid<<"\n";
    }
        m--;
    }
    f.close();
    g.close();
    return 0;
}