Cod sursa(job #2275266)

Utilizator DorianPopDorian Pop DorianPop Data 2 noiembrie 2018 22:52:46
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>

using namespace std;

int N, M, v[100003];



int cautPozMax(int x)
{
    int st=1, dr=N, mij = (st+dr)/2;

    while (st<=dr)
    {
        mij = (st+dr)/2;
        if (v[mij]==x)
        {
            while (v[mij]==x) mij++;
            return mij-1;
        }
        else if (x<v[mij]) dr=mij-1;
        else st = mij+1;
    }
    return -1;
}


int cautPozMax2(int x)
{
    int st=1, dr=N, mij = (st+dr)/2;

    while (st<=dr)
    {
        mij = (st+dr)/2;
        if (v[mij]==x)
        {
            while (v[mij]==x) mij++;
            return mij-1;
        }
        else if (x<v[mij]) dr=mij-1;
        else st = mij+1;
    }
    return -1;
}

int cautPozMin(int x)
{
    int st=1, dr=N, mij = (st+dr)/2;

    while (st<=dr)
    {
        mij = (st+dr)/2;
        if (v[mij]==x)
        {
            while (v[mij]==x) mij--;
            return mij+1;
        }
        else if (x<v[mij]) dr=mij-1;
        else st = mij+1;
    }
    return -1;
}

int main()
{


    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");

    fin>>N;
    for (int i=1; i<=N; i++)
    {
        fin>>v[i];
    }

    fin>>M;
    for (int i=1; i<=M; i++)
    {
        int q;
        fin>>q;
        if (q==0)
        {
            int x;
            fin>>x;
            fout<<cautPozMax(x)<<"\n";

        }
        else if (q==1)
        {
            int x;
            fin>>x;
            int poz = cautPozMax(x);
            if(poz!=1) fout<<poz<<"\n";
            else {
                int j =1 ;
                while (v[j]<=x) j++;
                fout<<j-1<<"\n";
            }
        }
        else if (q==2)
        {
            int x;
            fin>>x;
            fout<<cautPozMin(x)<<"\n";
        }

    }

}