Cod sursa(job #2780601)

Utilizator bogdan2405Strat Bogdan-Valentin bogdan2405 Data 7 octombrie 2021 12:54:51
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.37 kb
#include<bits/stdc++.h>

using namespace std;

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

int BinarySearch(vector<int> &v, int x,int left, int right){
    int mid;
    if(left<right){
        mid=(left+right)/2;

        if(x==v[mid])
            return mid;
        else if(x<v[mid]){
            return BinarySearch(v,x,left,mid-1);
        }
        
            return BinarySearch(v,x,mid+1,right);
        

    }
    return -1;
}

int BinarySearchMinEl(vector<int> &v,int x, int left, int right){
    if(left<right){
        int mid=(left+right)/2;

        if(x<=v[mid]){
            return BinarySearchMinEl(v,x,left,mid-1);
        }
        else if(x>v[mid]) {
            if(v[mid+1]==x){
                return mid;
            }
            else{
                return BinarySearchMinEl(v,x,mid+1,right);
            }

        }
    }
}

int BinarySearchMaxEl(vector<int> &v, int x,int left, int right){
    if(left<right){
        int mid=(left+right)/2;

        if(x>=v[mid])
            return BinarySearchMaxEl(v,x,mid+1,right);
        else if(x<v[mid]){
            if(x==v[mid-1])
                return mid;
            else{
                return BinarySearchMaxEl(v,x,left,mid-1);
            }
        }
    }
}
int main(){
    vector<int> v;
    int i,j,n,a,x,m,tip;
    f>>n;
    for(i=0;i<n;++i){
        f>>a;
        v.push_back(a);
    }

    f>>m;
    for(i=0;i<m;++i){
        f>>tip>>x;
        if(tip==0){
            a=BinarySearch(v,x,0,v.size()-1);
            if(a==-1){
                g<<-1<<'\n';
            }
            else{
                
                for(j=a+1;j<v.size();++j){
                    if(v[j]!=x)
                        g<<j-1+1<<'\n';
                }
            }
        }
        else if(tip==1){
            a=BinarySearch(v,x,0,v.size()-1);
            if(a==-1)
                g<<BinarySearchMinEl(v,x,0,v.size()-1)+1<<'\n';
            else{
                for(j=a+1;j<v.size();++j){
                    if(v[j]!=x)
                        g<<j-1+1<<'\n';
                }
            }
        }
        else{
            a=BinarySearch(v,x,0,v.size()-1);
            if(a==-1)
                g<<BinarySearchMaxEl(v,x,0,v.size()-1)+1<<'\n';
            else{
                for(j=a-1;j>=0;--j){
                    if(v[j]!=x)
                        g<<j+1+1<<'\n';
                }
            }
        }
    }


    return 0;
}