Cod sursa(job #526140)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 27 ianuarie 2011 15:38:03
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

#define NM 100005
#define PB push_back
#define MKP make_pair

int N, M, A[NM], ANS[NM];

vector < pair <int, int> > Tip0, Tip1, Tip2;

int main()
{
	freopen ("cautbin.in", "r", stdin);
	freopen ("cautbin.out", "w", stdout);
	
	scanf ("%d", &N);
	
	for (int i = 1; i <= N; ++i) scanf ("%d", &A[i]);
	
	scanf ("%d", &M);
	
	for (int i = 1; i <= M; ++i)
	{
		int op, x;
		scanf ("%d %d", &op, &x);
		
		if (op == 0) Tip0.PB(MKP(x, i));
		else if (op == 1) Tip1.PB(MKP(x, i));
		else Tip2.PB(MKP(x, i));
	}	
	
	int ind;
	
	// rezolv Tip0

	sort (Tip0.begin(), Tip0.end());
	
	ind = 1;
	for (int i = 0; i < Tip0.size(); ++i)
	{
		while (ind < N && A[ind] <= Tip0[i].first) ++ind;
		
		if (A[ind] > Tip0[i].first) --ind;
		
		if (A[ind] != Tip0[i].first) ANS[Tip0[i].second] = -1;
		else ANS[Tip0[i].second] = ind;
	}	
	
	// rezolv Tip1
	
	sort (Tip1.begin(), Tip1.end());
	
	ind = 1;
	for (int i = 0; i < Tip1.size(); ++i)
	{
		while (ind < N && A[ind] <= Tip1[i].first) ++ind;
		if (A[ind] > Tip1[i].first) --ind;
		
		ANS[Tip1[i].second] = ind;
	}	
	
	// rezolv Tip2
	
	sort (Tip2.begin(), Tip2.end());
	
	ind = 1;
	for (int i = 0; i < Tip2.size(); ++i)
	{
		while (ind < N && A[ind] < Tip2[i].first) ++ind;
		
		ANS[Tip2[i].second] = ind;
	}	
	
	for (int i = 1; i <= M; ++i) printf ("%d\n", ANS[i]);
	
	return 0;
}