Cod sursa(job #948985)

Utilizator robert_stefanRobert Stefan robert_stefan Data 12 mai 2013 00:56:21
Problema Cautare binara Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include<fstream>
#define IN "cautbin.in"
#define OUT "cautbin.out"
#define MAX 100000

using namespace std;

ifstream in(IN);
ofstream out(OUT);

int N, M, i, v[MAX], pos, nr, st, dr, mijl, posFav, k;

bool ok;

int main()
{
	in>>N;
	for(i=0; i<N; i++)
		in>>v[i];
	in>>M;
	for(i=0; i<M; i++)
	{
		in>>pos>>nr;
		if(pos==0)
		{
			posFav=-1;
			st=0, dr=N-1;
			while(st<=dr)
			{
				mijl=(st+dr)/2;
				if(v[mijl]==nr)
					posFav=mijl, st=dr+1;
				else
					if(nr<v[mijl])
						dr=mijl-1;
					else
						st=mijl+1;
			}
			if(posFav==-1)
				out<<"-1\n";
			else
			{
				while(v[++posFav]==nr)
					;
				out<<posFav<<'\n';
			}
		}
		else if(pos==1)
		{
			posFav=-1;
			st=0, dr=N-1;
			while(st<=dr)
			{
				mijl=(st+dr)/2;
				if(v[mijl]==nr)
					posFav=mijl, st=dr+1;
				else
					if(nr<v[mijl])
						dr=mijl-1;
					else
						st=mijl+1;
			}
			/*out<<dr<<endl;*/
			if(posFav==-1)
				out<<dr+1<<'\n';
			else
			{
				/*ok=0;
				for(k=posFav-1; k>=0; k--)
					if(v[posFav]!=v[k]){
						out<<k+2<<'\n', 
						ok=1;
						break;
					}
				if(!ok)*/
					for(k=posFav+1; k<N; k++)
						if(v[posFav]!=v[k]){
							out<<k<<'\n';
							break;
						}
				//out<<posFav<<endl;
			}
		}
		else if(pos==2)
		{
			posFav=-1;
			st=0, dr=N-1;
			while(st<=dr)
			{
				mijl=(st+dr)/2;
				if(v[mijl]==nr)
					posFav=mijl, st=dr+1;
				else
					if(nr<v[mijl])
						dr=mijl-1;
					else
						st=mijl+1;
			}
			if(posFav==-1)
				out<<st+1<<'\n';
			else
			{
				/*ok=0;
				for(k=posFav+1; k<N; k++)
					if(v[posFav]!=v[k]){
						out<<k<<'\n', 
						ok=1;
						break;
					}*/
				if(!ok)
					for(k=posFav-1; k>=0; k--)
						if(v[posFav]!=v[k]){
							out<<k+2<<'\n';
							break;
						}
				//out<<posFav<<endl;
			}
		}
	}
	in.close();
	out.close();
	return 0;
}