Cod sursa(job #1612266)

Utilizator criss1996Axente Cristina criss1996 Data 24 februarie 2016 19:29:32
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.57 kb
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");
int v[100001];
int main()
{
    int m, n, st, dr, mij, ok, i, x, c, poz;
    f>>n;
    for(i=1; i<=n; i++)
        f>>v[i];
    f>>m;
    for(i=1; i<=m; i++)
    {
        f>>c>>x;
        switch(c)
        {
        case 0:
            st=1;
            dr=n;
            ok=0;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                if(v[mij]==x)
                {
                    poz=mij;
                    ok=1;
                    break;
                }
                else if(x<v[mij])
                    dr=mij-1;
                else
                    st=mij+1;
            }
            if(ok)
            {
                while(v[poz+1]==x)
                    poz++;
                g<<poz<<'\n';
            }
            else
                g<<-1<<'\n';

            break;
        case 1:
            st=1;
            dr=n;
            ok=0;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                if(v[mij]==x)
                {
                    poz=mij;
                    ok=1;
                    break;
                }
                else
                {
                    if(x<v[mij])
                        dr=mij-1;
                    else
                        st=mij+1;
                }
            }
            if(ok)
            {
                while(v[poz+1]==x)
                    poz++;
                g<<poz<<'\n';
            }
            else
            {
                if(st>n || v[st]>x)
                    g<<dr<<'\n';
                else
                    g<<st<<'\n';
            }
            break;
        case 2:
            st=1;
            dr=n;
            ok=0;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                if(v[mij]==x)
                {
                    poz=mij;
                    ok=1;
                    break;
                }
                else if(x<v[mij])
                    dr=mij-1;
                else
                    st=mij+1;
            }
            if(ok)
            {
                while(v[poz-1]==x)
                    poz--;
                g<<poz<<'\n';
            }
            else
            {
                if(dr<1 || v[dr]<x)
                    g<<st<<'\n';
                else
                    g<<dr<<'\n';
            }
        }
    }

    return 0;
}