Cod sursa(job #2185760)

Utilizator CristyXtremeSimion Cristian CristyXtreme Data 24 martie 2018 20:46:35
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>
#include <algorithm>

using namespace std;

FILE *f=fopen("cautbin.in","r"),*g=fopen("cautbin.out","w");
int n,m;
int v[100000];

void solve1(int left,int right,int a)
{
    int middle;
    while(left<right)
    {
        middle=left+(right-left)/2;
        if(v[middle]==a)
            break;
        if(a<v[middle])
            right=middle-1;
        if(a>v[middle])
            left=middle+1;
    }
    middle=left+(right-left)/2;
    if(v[middle]>a)
        middle--;
    else
    {
        while(v[middle+1]==v[middle])
            middle++;
    }
    fprintf(g,"%i\n",middle+1);
}

void solve2(int left,int right,int a)
{
    int middle;
    while(left<right)
    {
        middle=left+(right-left)/2;
        if(v[middle]==a)
            break;
        if(a<v[middle])
            right=middle-1;
        if(a>v[middle])
            left=middle+1;
    }
    middle=left+(right-left)/2;
    if(v[middle]<a)
        middle++;
    else
    {
        while(v[middle]==v[middle-1])
            middle--;
    }
    fprintf(g,"%i\n",middle+1);
}

void citire_si_rezolvare()
{
    fscanf(f,"%i",&n);
    for(int i=0;i<n;i++)
        fscanf(f,"%i",&v[i]);
    fscanf(f,"%i",&m);
    for(int i=0,a,b;i<m;i++)
    {
        fscanf(f,"%i %i",&a,&b);
        if(a==0)
        {
            int *up=upper_bound(v,v+n,b);
            if((up!=v+n)||(v[up-v-1]==b))
                fprintf(g,"%i\n",up-v);
            else
                fprintf(g,"-1\n");
        }
        if(a==1)
            solve1(0,n-1,b);
        if(a==2)
            solve2(0,n-1,b);
    }
}

int main()
{
    citire_si_rezolvare();
    return 0;
}