Cod sursa(job #2076400)

Utilizator Cristian25Cristian Stanciu Cristian25 Data 26 noiembrie 2017 15:35:09
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
//Enunt: http://www.infoarena.ro/problema/cautbin
#include <iostream>
#include <fstream>

using namespace std;
ifstream in("cautbin.in");
ofstream out("cautbin.out");
int N,M;
struct question{
    short abs,ord;
};
int cbin(int v[],int x,int st,int dr)
{
    if(st<=dr)
    {
        int mij=(st+dr)/2;
        if(x<v[mij])
            return cbin(v,x,st,mij-1);
        if(x>v[mij])
            return cbin(v,x,mij+1,dr);
        if(x==v[mij] && x==v[mij+1])
            return cbin(v,x,mij+1,dr);
        if(x==v[mij] && x!=v[mij+1])
            return mij;
    }
    else return -1;
}
int cbin2(int v[],int x,int st,int dr)
{
    if(st<=dr)
    {
        int mij=(st+dr)/2;
        if(x<v[mij])
            return cbin2(v,x,st,mij-1);
        if(x>v[mij])
            return cbin2(v,x,mij+1,dr);
        if(x==v[mij] && x==v[mij-1])
            return cbin2(v,x,st,mij-1);
        if(x==v[mij] && x!=v[mij-1])
            return mij;
    }
    else return -1;
}
int main()
{
    in>>N;
    int s[N+1],i;
    for(i=1;i<=N;++i)
        in>>s[i];
    in>>M;
    struct question t[M+1];
    for(i=1;i<=M;++i)
    {
        in>>t[i].abs>>t[i].ord;
        if(t[i].abs==0)
            out<<cbin(s,t[i].ord,1,N)<<'\n';
        if(t[i].abs==1)
        {
            bool gasit=0;
            for(i=t[i].ord;i>=s[1] && !gasit;--i)
                if(cbin(s,i,1,N)!=-1)
                {
                    gasit=1;
                    out<<cbin(s,i,1,N)<<'\n';
                }
            if(!gasit)
                out<<-1<<'\n';
        }
        if(t[i].abs==2)
        {
            bool gasit=0;
            for(i=t[i].ord;i<=s[N] && !gasit;++i)
                if(cbin(s,i,1,N)!=-1)
                {
                    gasit=1;
                    out<<cbin2(s,i,1,N)<<'\n';
                }
            if(!gasit)
                out<<-1<<'\n';
        }
    }
    return 0;
}