Cod sursa(job #2065289)

Utilizator antracodRadu Teodor antracod Data 13 noiembrie 2017 18:00:42
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int NMAX = 100000;

int v[NMAX+2];
 int n;

int ClasicBS(int x)
{
    int low=1,high=n;
    int mid = low + (high-low)/2;
    while(low<=high)
    {
        int mid = low + (high-low)/2;
        if(v[mid]==x)
            return mid;
        else if(v[mid]<x)
            low=mid+1;
        else
            high=mid-1;
    }
    return -1;
}
int AddBS(int x,int pw2)
{
    int sol=1;
    for(int i=pw2;pw2>=1;pw2=pw2/2)
    {
        if(sol+pw2<=n && v[sol+pw2]<=x)
            sol+=pw2;
    }
    return sol;
}
int RemoveBS(int x,int pw2)
{
    int sol=n;
    for(int i=pw2;pw2>=1;pw2=pw2/2)
    {
        if(sol-pw2>=1 && v[sol-pw2]>=x)
            sol-=pw2;
    }
    return sol;
}

int pwgen(int k)
{
    int pw2=1;
    while(pw2<=k){pw2=pw2*2;}
    return pw2/2;
}
int main()
{
    int t;
    int pw2;
    in>>n;
    for(int i=1;i<=n;i++)
    {
        in>>v[i];
    }
    in>>t;
    pw2=pwgen(n);


    for(int i=1;i<=t;i++)
    {
        int Case,x;
        in>>Case>>x;
        if(Case==0)
        {
            int sol=AddBS(x,pw2);
            if(x==v[sol])
                out<<sol<<'\n';
            else
                out<<-1<<'\n';
        }
        else if(Case==1)
        {
            out<<AddBS(x,pw2)<<'\n';
        }
        else
        {
            out<<RemoveBS(x,pw2)<<'\n';
        }
    }
}