Cod sursa(job #1428814)

Utilizator PletoPletosu Cosmin-Andrei Pleto Data 5 mai 2015 09:47:01
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.09 kb
#include<fstream>
#define MAXIM 100010
using namespace std;
ifstream in("cautbin.in");
ofstream out("cautbin.out");
int V[MAXIM];
int main ()
{
    int N,M,type,x,st,dr;
    in>>N;
    for(int i=1;i<=N;i++) in>>V[i];
    in>>M;
    for(int i=1;i<=M;i++)
    {
        in>>type>>x;
        switch(type)
        {

            case 0:
            ///se cauta cea mai mare pozitie pe care se afla un element cu valoarea x si se afiseaza
            ///in cazul in care nu se gaseste elementul x in vector se va afisa "-1"
            {
                int m;
                st=1; dr=N;
                ///st reprezinta capatul cel mai din stanga, si dr reprezinta capatul cel mai din dreapta
                while(st<=dr)
                ///continua sa caute cat timp [st,dr] nu este vid
                {
                    m=(st+dr)/2;
                    ///m este pozitia elementului din mijlocul sirului [st,dr]
                    if(V[m]<=x) st=m+1; ///in cazul in care V[m] este mai mic decat numarul cautat atunci
                                        ///cautarea se restrange in partea dreapta a sirului
                                        ///daca V[m] == x atunci continuam sa marim st pentru a gasi pozitia
                                        ///celui mai din dreapta. cand V[m]>dr inseamna ca V[m] este primul numar
                                        ///dupa secventa de numere egale cu x
                    else dr=m-1;
                                        ///in cazul in care V[m] este mai mare decat numarul cautat atunci
                                        ///cautarea se restrange in partea stanga a sirului
                }
                if(V[dr]==x) out<<dr<<"\n";
                ///daca s-a gasit elementul se afiseaza pozitia cea mai din dreapta
                else out<<"-1"<<"\n";
                ///altfel se afiseaza mesajul ca nu exista, si anume "-1"
                break;
            }
            case 1:
            ///se cauta cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala
            ///cu x in sir si se afiseaza
            {
                int m;
                st=1; dr=N;
                while(st<=dr)
                {
                    m=(st+dr)/2;
                    if(V[m]<=x) st=m+1; else dr=m-1;
                }
                out<<dr<<"\n";
                break;
            }
            case 2:
            ///se cauta cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala
            ///cu x in sir si se afiseaza
            {
                int m;
                st=1; dr=N;
                while(st<=dr)
                {
                    m=(st+dr)/2;
                    if(V[m]<x) st=m+1;
                    else dr=m-1;
                    ///daca V[m]>=x atunci cautarea se restrange in partea stanga
                }
                out<<st<<"\n";
                ///cand st>dr atunci in st o sa fie prima pozitie a elementului cautat in sir
                break;
            }
        }
    }
    out.close();return 0;
}