Cod sursa(job #1934777)

Utilizator darian2001Clodnischi Darian Antonio darian2001 Data 21 martie 2017 20:05:24
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

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

int n,t;
vector <pair<unsigned long long,int> > v(100000);

void cautare_binara(int tip,unsigned long long nr)
{
    int L=0,R=n-1,gasit=false,poz;
    if(tip==2)poz=100001;
    else poz=0;
    unsigned long long m;
    while(L<=R)
    {
        m=(L+R)/2;
        switch(tip)
        {
        case 0:
                {
                    if(v[m].first==nr)
                    {gasit=true;
                        if(v[m].second>poz)
                            poz=v[m].second;
                    }
                    if(v[m].first<=nr)
                    {
                        L=m+1;
                    }
                    else
                    {
                        R=m-1;
                    }
                }
                break;
        case 1:
               {
                    if(v[m].first<=nr)
                    {
                        gasit=true;
                        if(v[m].second>poz)
                            poz=v[m].second;
                        L=m+1;
                    }
                    else
                    {
                        R=m-1;
                    }
                }
                break;
        case 2:
                {
                    if(v[m].first>=nr)
                    {
                        gasit=true;
                        if(v[m].second<poz)
                            poz=v[m].second;
                        R=m-1;
                    }
                    else
                    {
                        L=m+1;
                    }
                }

        }
    }
    if(gasit==true)
        g<<poz<<"\n";
    else
        g<<-1<<"\n";




}


int main()
{
    f>>n;
    for(int i=0;i<n;i++)
    {
        f>>v[i].first;
        v[i].second=i+1;
    }
    sort(v.begin(),v.begin()+n);
    f>>t;
    int tip;
    unsigned long long nr;
    for(int i=0;i<t;i++)
    {
        f>>tip>>nr;
        cautare_binara(tip,nr);
    }
    f.close();
    g.close();
}