Cod sursa(job #2098210)

Utilizator RaresLiscanLiscan Rares RaresLiscan Data 2 ianuarie 2018 15:57:37
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.4 kb
#include <fstream>

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

        else if (f[i]==1) {
            s=0;
        d=n-1;
        ok=0;
        while (ok==0&&d>=s) {
            g=(s+d)/2;
            if (v[g]==x[i]) {
                ok=1;
            }
            else if (v[g]<x[i]) {
                    s=g+1;
                }
                else {
                    d=g-1;
                }
            }
            if (ok==1) {
                for (j=g;j<n&&ok==1;j++) {
                    if (v[j]>x[i]) {
                        ok=0;
                    }
                }
                fout<<j-1<<"\n";
            }
            else {
                fout<<g-1<<"\n";
            }
        }
        else if (f[i]==2){
        s=0;
        d=n-1;
        ok=0;
        while (ok==0&&d>=s) {
            g=(s+d)/2;
            if (v[g]==x[i]) {
                ok=1;
            }
            else if (v[g]<x[i]) {
                    s=g+1;
                }
                else {
                    d=g-1;
                }
            }
            if (ok==1) {
                for (j=g-1;j>=0&&ok==1;j--) {
                    if (v[j]<x[i]) {
                        ok=0;
                    }
                }
                fout<<j+3<<"\n";
            }
            else {
                fout<<g<<"\n";
            }
        }
        }
    return 0;
}