Cod sursa(job #2098889)

Utilizator DanielznaceniDaniel Danielznaceni Data 3 ianuarie 2018 17:23:15
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.39 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("cautbin.in");
ofstream out("cautbin.out");
int n1[100005];
char m1[100005];
int m2[100005];
int main()
{
    int n, m, i, st, dr, mi;
    in>>n;
    for(i=1; i<=n; ++i)
    {
        in>>n1[i];
    }
    in>>m;
    for(i=1; i<=m; ++i)
    {
        in>>m1[i];
        in>>m2[i];
    }
    for(i=1; i<=m; ++i)
    {
        st=1;
        dr=n;
        if(m1[i]=='0')
        {
            while(st<dr)
            {
            mi=st +(dr-st)/2;
            if(n1[mi]>m2[i])
            {
                dr=mi-1;
            }
            else if(n1[mi]<m2[i])
            {
                st=mi+1;
            }
            else
            {
                st=mi;
                while(n1[mi]==n1[st])
                {
                    ++st;
                }
                st=st-1;
                dr=st;
            }
            }
            if(n1[st]==m2[i])
            {
                out<<st;
            }
            else
            {
                out<<-1;
            }
        }
        else if(m1[i]=='1')
        {
            while(st<dr)
            {
                mi=st+ (dr-st)/2;
                if(n1[mi]<m2[i])
                {
                    st=mi+1;
                }
                else if(n1[mi]>m2[i])
                {
                    dr=mi-1;
                }
                else
                {
                    st=mi;
                    while(n1[mi]==n1[st])
                    {
                        ++st;
                    }
                    st=st-1;
                    dr=st;
                }
            }
            out<<st;
        }
        else
        {
            while(st<dr)
            {
                mi=st+ (dr-st)/2;
                if(n1[mi]<m2[i])
                {
                    st=mi+1;
                }
                else if(n1[mi]>m2[i])
                {
                    dr=mi;
                }
                else
                {
                    dr=mi;
                    while(n1[mi]==n1[dr])
                    {
                        --dr;
                    }
                    dr=dr+1;
                    st=dr;
                }
            }
            out<<st;
        }
        out<<"\n";
    }
    return 0;
}