Cod sursa(job #2774769)

Utilizator AdrianDiaconitaAdrian Diaconita AdrianDiaconita Data 12 septembrie 2021 18:45:49
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.44 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
struct bound {
    int val;
    int poz;
};

int bs (int n,int v[100001],int x,int st,int dr)
{
    int mij=st+(dr-st)/2;
    if (st<=dr)
    {
        if (v[mij]==x)
        {
            while (v[mij+1]==x)
            {
                mij++;
            }
            return mij;
        }
        if (v[mij]<x)
        {
            return bs(n,v,x,mij+1,dr);
        }
        if (v[mij]>x)
            return bs(n,v,x,st,mij-1);
    }
    else return -1;
}

int low_bound (int n, int v[100001],int x,int st,int dr,bound lb)
{
    int mij=st+(dr-st)/2;
    while (st<=dr)
    {
        if (v[mij]==x)
        {
            while (v[mij+1]==x)
            {
                mij++;
            }
            return mij;
        }
        else if (v[mij]<x)
        {
            if (v[mij]>lb.val)
            {
                lb.val=v[mij];
                lb.poz=mij;
            }
            if (v[mij]<lb.val) return lb.poz;
            return low_bound (n,v,x,mij+1,dr,lb);
        }
        if (v[mij]>x)
        {
            return low_bound (n,v,x,st,mij-1,lb);
        }
    }
    if (st>dr) return lb.poz;
}

int up_bound(int n, int v[100001],int x,int st,int dr,bound ub)
{
    int mij=st+(dr-st)/2;
    while (st<=dr)
    {
        if (v[mij]==x)
        {
            while (v[mij-1]==x)
            {
                mij--;
            }
            return mij;
        }
        else if (v[mij]>x)
        {
            if (v[mij]>ub.val)
            {
                ub.val=v[mij];
                ub.poz=mij;
            }
            if (v[mij]<ub.val) return ub.poz;
            return up_bound (n,v,x,mij+1,dr,ub);
        }
        if (v[mij]<x)
        {
            return up_bound (n,v,x,st,mij-1,ub);
        }
    }
    if (st>dr) return ub.poz;
}

int main()
{
    int n,v[100001],m,c,x;
    bound lb,ub;
    fin>>n;
    for (int i=1;i<=n;i++)
    {
        fin>>v[i];
    }
    fin >> m;
    for (int i=1;i<=m;i++)
    {
        fin>>c>>x;
        if (c==0)
        {
           fout<< bs (n,v,x,1,n) << '\n';
        }
        if (c==1)
        {
            fout<<low_bound(n,v,x,1,n,lb) << '\n';
        }
        if (c==2)
        {
            fout<<up_bound (n,v,x,1,n,ub) << '\n';
        }
    }
    return 0;

}