Cod sursa(job #2251397)

Utilizator Matei_TipleaMatei Tiplea Matei_Tiplea Data 1 octombrie 2018 16:03:34
Problema Cautare binara Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>

using namespace std;

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

int c1(int a[],int n,int y);
int c2(int a[],int n,int y);
int c3(int a[],int n,int y);

int c1(int a[],int n,int y)
{
    int st=1,dr=n,mij,gasit=0,poz,i;
    while(st<=dr&&gasit==0)
    {
        mij=st+(dr-st)/2;
        if(a[mij]==y) {gasit=1;poz=mij;}
        else if(a[mij]<y)st=mij+1;
        else dr=mij-1;
    }
    if(gasit==0) return -1;
    for(i=poz;i<=n;i++)
    {
        if(a[i]!=y) break;
    }
    return i-1;
}

int c2(int a[],int n,int y)
{
    if(c1(a,n,y)!=-1) return c1(a,n,y);
    else
    {
        int i,st=1,dr=n,mij;
        while(st<=dr)
        {
            mij=st+(dr-st)/2;
            if(a[mij]<y)st=mij+1;
            else dr=mij-1;
        }
        if(a[st]<y) return st;
        else
        {
            for(i=st;i>=1;i--)
                if(a[i]<y&&a[i+1]>y) break;
        }
        return i;
    }
}

int c3(int a[],int n,int y)
{
    int i,k;
    if(c1(a,n,y)!=-1)
    {
        k=c1(a,n,y);
        for(i=k;i>=1;i--)
            if(a[i]!=y) break;
        return i+1;
    }
    else
    {
        int st=1,dr=n,mij;
        while(st<=dr)
        {
            mij=st+(dr-st)/2;
            if(a[mij]<y)st=mij+1;
            else dr=mij-1;
        }
        if(a[st]>y) return st;
    }
}

int main()
{
    int n,a[100001],m,i,x,y;
    fin>>n;
    for(i=1;i<=n;i++) fin>>a[i];
    fin>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        if(x==0) fout<<c1(a,n,y)<<"\n";
        if(x==1) fout<<c2(a,n,y)<<"\n";
        if(x==2) fout<<c3(a,n,y)<<"\n";
    }
    return 0;
}