Cod sursa(job #368237)

Utilizator cristiprgPrigoana Cristian cristiprg Data 24 noiembrie 2009 11:20:59
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <fstream>
#include <iostream>
#include <cstdio>
using namespace std;
int n,a[100001], m;



inline int BS2(int x)
{
    int lo, hi, mid, last = 0;
 
    for (lo = 1, hi = n; lo <= hi; )
    {
        mid = lo + (hi-lo) / 2;
        if (a[mid] <= x) last = mid, lo = mid+1;
        else hi = mid-1;
    }
    return last;
}
 
inline int BS3(int x)
{
    int lo, hi, mid, last = n+1;
 
    for (lo = 1, hi = n; lo <= hi; )
    {
        mid = lo + (hi-lo) / 2;
        if (x <= a[mid]) last = mid, hi = mid-1;
        else lo = mid+1;
    }
    return last;
}


inline int BS1(int x)
{
    int lo, hi, mid;
 
    for (lo = 1, hi = n; lo <= hi; )
    {
        mid = lo + (hi-lo) / 2;
        if (x < a[mid]) hi = mid-1;
        else if (a[mid] < x) lo = mid+1;
        else return mid;
    }
    return -1;
}


inline int f0(int x){
	int st=1,dr=n,rez = -1;
	while(st<=dr){
		int m = st+(dr-st)/2;
//		cout<<m<<" ";
		if( a[m] == x)
			 rez = m;
		if(a[m]<x)
				 st = m+1;
		else
			dr= m-1;
	}
	return rez;
}
inline int f1(int x){
	int st=1,dr=n,rez;
	while(st<=dr){
		int m = st+(dr-st)/2;
		if(a[m]<=x)
			rez = m, st= m+1;
		else
			dr = m-1;
	}
	return rez;
}
inline int f2(int x){
	int st=1,dr=n, rez;
	while(st<=dr){
		int m =st+(dr-st)/2;
		if(a[m]>=x)
			rez = m , dr = m-1;
		else
			st = m+1;

	}
	return rez;
}
int main2(){
 int i, t, x;
     
	ifstream fin("cautbin.in");
	ofstream fout("cautbin.out");
	
    fin >> n;
    for (i = 1; i <= n; ++i)
        fin >> a[i];
         
    fin >> m;
    for (; m; --m)
    {
        fin >> t >> x;
        if (!t)
            fout << BS1(x) << endl;
        else if (t == 1)
            fout << BS2(x) << endl;
        else
            fout << BS3(x) << endl;
    }
	return 0;
}

int main()
{
    int i, t, x;
     
    FILE *f = fopen("cautbin.in", "r");
	FILE *out = fopen("cautbin.out", "w");
	
    
 
    fscanf(f, "%d", &n);   
    for (i = 1; i <= n; ++i)
        fscanf(f, "%d", &a[i]);
         
    fscanf(f, "%d", &m);
    for (; m; --m)
    {
        fscanf(f, "%d %d", &t, &x);
        if (!t)
            fprintf(out, "%d\n", BS1(x));
        else if (t == 1)
            fprintf(out, "%d\n", BS2(x));
        else
            fprintf(out, "%d\n", BS3(x));
    }
	return 0;
}