Cod sursa(job #3280103)

Utilizator MoxelBagiu Matei-Octavian Moxel Data 25 februarie 2025 13:46:18
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");

int mij,dr,st=1,n,M,x,v[100001],optiune;

void cautbin(int op)
{
    switch(op)
    {
        case 0:
        {
            int k=0;
            while(st<=dr)
            {
                if(v[mij]>x)
                {
                    dr=mij-1;
                    mij=(st+dr)/2;
                }
                if(v[mij]<x)
                {
                    st=mij+1;
                    mij=(st+dr)/2;
                }
                if(v[mij]==x)
                {
                    break;
                }
            }
            for(int i=mij;i<=n;i++)
            {
                if(v[i]==x)
                    k++;
                else
                {
                    fout<<i-1<<endl;break;
                }
            }
            if(k==0)
                fout<<-1<<endl;
            break;
        }
        case 1:
        {
            while(st<=dr)
            {
                if(v[mij]<x)
                {
                    st=mij+1;
                    mij=(st+dr)/2;
                }
                if(v[mij]>x)
                {
                    dr=mij-1;
                    mij=(st+dr)/2;
                }
                if(v[mij]==x)
                {
                    break;
                }
            }
            for(int i=mij;i<=n;i++)
                if(v[i+1]>x)
                {
                    fout<<i<<endl;break;
                }
            break;
        }
        case 2:
        {
            while(st<=dr)
            {
                if(v[mij]<x)
                {
                    st=mij+1;
                    mij=(st+dr)/2;
                }
                if(v[mij]>x)
                {
                    dr=mij-1;
                    mij=(st+dr)/2;
                }
                if(v[mij]==x)
                {
                    break;
                }
            }
            int k=0;
            while(v[mij]>=x)
            {
                mij--;
            }
            fout<<mij+1<<endl;
            break;
        }
    }
}
int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    fin>>M;
    for(int i=0;i<M;++i)
    {
        fin>>optiune>>x;
        st=1;
        dr=n;
        mij=(st+dr)/2;
        cautbin(optiune);
    }
}