Cod sursa(job #1259455)

Utilizator CalinCojoFMI Cojocaru Calin George CalinCojo Data 9 noiembrie 2014 23:59:45
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.5 kb
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    long n,m;
    long v[100002];
    ifstream f("cautbin.in",ios::in);
    ofstream g("cautbin.out",ios::out);
    f>>n;
    for(int i=1;i<=n;i++){
        f>>v[i];
    }
    f>>m;
    while(m){
        int caz,x;
        f>>caz>>x;

        if(caz==0){
            int left=1,right=n,mid;
            int 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";
            }
            else{

                while(v[mid+1]==x){
                    mid++;
                }
                g<<mid<<endl;

            }
        }

        if(caz==1){

        int left=1,right=n,mid;
        int 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<<endl;
    }

    if(caz==2){
        int left=1,right=n,mid;
        int 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<<endl;
    }

        m--;
    }
    return 0;
}