Cod sursa(job #2105078)

Utilizator RaresLiscanLiscan Rares RaresLiscan Data 12 ianuarie 2018 16:54:19
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.54 kb
#include <fstream>

using namespace std;
int v[100005];
int main()
{
    ifstream fin ("cautbin.in");
    ofstream fout ("cautbin.out");
    int n;
    fin>>n;
    int i;
    for (i=0;i<n;i++) {
        fin>>v[i];
    }
    int m,q,x,d,s,mi;
    bool ok;
    fin>>m;
    for (i=0;i<m;i++) {
        fin>>q>>x;
        if (q==0) {
            d=n-1,s=0;
            ok=0;
            while (ok==0&&d>=s) {
                mi=(d+s)/2;
                if (x==19) {
                }
                if (v[mi]==x) {
                    ok=1;
                }
                else if (v[mi]>x) {
                    d=mi-1;
                }
                else {
                    s=mi+1;
                }
            }
            if (ok==1) {
                while (v[mi+1]==x&&mi+1<n) {
                    mi++;
                }
                fout<<mi+1<<"\n";
            }
            else {
                fout<<-1<<"\n";
            }
        }
        else if (q==1) {
            d=n-1,s=0;
            ok=0;
            while (ok==0&&d>=s) {
                mi=(d+s)/2;
                if (v[mi]==x) {
                    ok=1;
                }
                else if (v[mi]>x) {
                    d=mi-1;
                }
                else {
                    s=mi+1;
                }
            }
            if (ok==1) {
                while (v[mi+1]==x&&mi+1<n) {
                    mi++;
                }
                fout<<mi+1<<"\n";
            }
            else {
                while (v[d]>x) {
                    d--;
                }
                fout<<d+1<<"\n";
            }
        }
        else if (q==2) {
            d=n-1,s=0;
            ok=0;
            while (ok==0&&d>=s) {
                mi=(d+s)/2;
                if (v[mi]==x) {
                    ok=1;
                }
                else if (v[mi]>x) {
                    d=mi-1;
                }
                else {
                    s=mi+1;
                }
            }
            if (ok==1) {
                while (v[mi-1]>=x&&mi-1>=0) {
                    mi--;
                }
                fout<<mi+1<<"\n";
            }
            else {
                if (v[s]>=x) {
                    fout<<s+1<<"\n";
                }
                else {
                    while (v[s]<x) {
                        s++;
                    }
                    fout<<s+1<<"\n";
                }
            }
        }
    }
    return 0;
}