Cod sursa(job #1712076)

Utilizator Fanika123Tanasa Stefan Fanika123 Data 1 iunie 2016 22:31:35
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include <fstream>
using namespace std;
ifstream cin("cautbin.in");
ofstream cout("cautbin.out");
int n,m;
long long a[100005];
void Rezolva_0(int x)
{
     bool gasit=false;
     int st=1,dr=n,mj,poz;
     while(st<=dr && gasit==false)
      {
          mj=st+(dr-st)/2;
          if (x==a[mj])
           {
              gasit=true;
              poz=mj;
           }
          else if (x<a[mj])
                 dr=mj-1;
               else st=mj+1;
      }
     if (gasit==false) cout<<"-1\n";
     else {
            ///va trebui sa vad ultima pozitie a lui x
            while(a[poz]==x && poz<=n)
              poz++;
            cout<<poz-1<<"\n";
          }
}
void Rezolva_1(int x)
{
    ///trebuie sa gasesc pozitia unde se afla primul x din vector
    bool gasit=false;
    int st=1,dr=n,mj,poz;
    while(st<=dr && gasit==false)
     {
         mj=st+(dr-st)/2;
         if (x==a[mj])
          {
            gasit=true;
            poz=mj;
          }
         else if (x<a[mj]) dr=mj-1;
              else st=mj+1;
     }
     ///acum am pozitia poz, va trebuie sa il descresc pana la primul element x
     while(a[poz]<=x && poz<=n)
        poz++;
     poz-=1;
     cout<<poz<<"\n";
}
void Rezolva_2(int x)
{
    bool gasit=false;
    int st=1,dr=n,mj,poz;
    while(st<=dr && gasit==false)
     {
         mj=st+(dr-st)/2;
         if (x==a[mj])
          {
            gasit=true;
            poz=mj;
          }
         else if (x<a[mj]) dr=mj-1;
              else st=mj+1;
     }
    ///acum ca am pozitia unde se gaseste o valoare x,
    ///voi putea calcula ce mi se cere la cerinta 1
    while(a[poz]>=x && poz>=1)
       poz--;
    poz++;
    cout<<poz<<"\n";
}
int main()
{
    int i,val,x;
    cin>>n;
    for (i=1;i<=n;i++)
      cin>>a[i];
    cin>>m;
    for (i=1;i<=m;i++)
    {
        cin>>val>>x;
        /**
        daca val este 0, trebuie sa vad care este
        ultima pozitie de-a lui x (daca exista);
        daca nu exista, voi pune -1
        **/
        if (val==0)
           Rezolva_0(x);
        else if (val==1)
              Rezolva_1(x);
             else if (val==2)
                   Rezolva_2(x);
    }
    return 0;
}