Cod sursa(job #371484)

Utilizator nandoLicker Nandor nando Data 5 decembrie 2009 15:25:24
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>

using namespace std;

int sir[100000],ls,m,v,N;

int binary_search(int beg,int end,int val){
	v=val;
	if(beg+1==end){
		if(sir[beg]==val){
			return beg;
		}else if(sir[end]==val){
			return end;
		}else{
			if(m==1){
				for(int i=beg;i<N;i++){
					if(sir[i]>=v){
						ls=i;
					}
				}
			}else if(m==2){
				for(int i=end;i>=0;i--){
					if(sir[i]>=v){
						ls=i;
					}
				}
			}
			return -1;			
		}
	}else{
		int mdl=(end+beg)/2;
		if(sir[mdl]==val){
			return mdl;
		}else if(sir[mdl]<val){
			return binary_search(mdl,end,val);
		}else if(sir[mdl]>val){
			return binary_search(beg,mdl,val);
		}
	}
	return -1;
}
int main(){
	int M,x,op;
	fstream fin("cautbin.in",ios::in);
	fstream fout("cautbin.out",ios::out);
	fin>>N;
	for(int i=0;i<N;i++){
		fin>>sir[i];
	}
	fin>>M;
	for(int i=0;i<M;i++){
		fin>>op>>x;
		m=op;
		if(op==0){
			int pos=binary_search(0,N,x);
			if(pos!=-1){
				while(sir[pos+1]==x){
					pos++;
				}
			}
			fout<<pos+1<<endl;
		}else if(op==1){
			int pos=binary_search(0,N,x);
			if(pos!=-1){
				while(sir[pos+1]==x){
					pos++;
				}
			}else{
				pos=ls;
			}
			fout<<pos+1<<endl;
		}else if(op==2){
			int pos=binary_search(0,N,x);
			if(pos!=-1){
				while(sir[pos-1]==x){
					pos--;
				}
			}else{
				pos=ls;
			}
			fout<<pos+1<<endl;
		}
	}
	fin.close();
	fout.close();
	return 0;
}