Cod sursa(job #797584)

Utilizator SovStoStoicescu Mihail Cristian SovSto Data 14 octombrie 2012 14:04:33
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>

using namespace std;



int n,a[100000],m,x,y,i;

int one(int lo,int hi,int y)
{int mid;
     while(lo<hi)
     {mid=lo+(hi-lo)/2;
     if(a[mid]<=y)lo=mid+1;
         else hi=mid-1;
     }
     mid=lo+(hi-lo)/2;
     if(a[mid]>y)mid--;
     if(a[mid]==y)return mid;
     return -1;
} 

int two(int lo,int hi,int y)
{
    int mid;
    while(lo<hi)
    {mid=lo+(hi-lo)/2;
    if(a[mid]<=y) lo=mid+1;
                  else hi=m-1;
    }
    mid=lo+(hi-lo)/2;
    if(a[mid]>y)mid--;
    return mid;
}

int thr(int lo,int hi,int y)
{
    int mid;
    
    /*while (lo < hi) {
        mid = (lo + hi) / 2;
        if (a[mid] < y)
            lo = mid + 1;
        else
            hi = mid;
    }
    
    mid = (lo + hi) / 2;
    if (a[m] < y)
       ++ mid;*/
    while(lo<hi)
    {
                 mid=lo+(hi-lo)/2;
                 if(a[mid]<y)lo=mid+1;
                    else hi=mid;
    }
    mid=lo+(hi-lo)/2;
    if(a[mid]<y)mid++;
    return mid;
}

int main()
{         ifstream f("cautbin.in");
          ofstream g("cautbin.out");
          f>>n;
          for(i=1;i<=n;i++)
                        f>>a[i];
          f>>m;
          for(i=m;i>=1;i--)
          {           x=0;y=0;
                      f>>x>>y;
                      int k;
                      if(x==0) k=one(1,n,y);
                      if(x==1) k=two(1,n,y);
                      if(x==2) k=thr(1,n,y); 
                      g <<k<<"\n";               
          }
}