Cod sursa(job #1357540)

Utilizator vlad.maneaVlad Manea vlad.manea Data 23 februarie 2015 22:59:22
Problema Cautare binara Scor 20
Compilator java Status done
Runda Arhiva educationala Marime 2.64 kb
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Array {
	List<Integer> numbers;

	public Array(List<Integer> numbers) {
		this.numbers = numbers;
	}

	public int getPosEqual(int value) {
		int position = getPosLesserEqual(value);
		
		if (numbers.get(position) != value) {
			return -1;
		}
		
		return position;
	}

	public int getPosLesserEqual(int value) {
		// The largest position of an element <= value.
		
		int leftPos = 0;
		int rightPos = numbers.size() - 1;
		int largePosition = Integer.MIN_VALUE;
		
		while (leftPos <= rightPos) {
			int midPos = (leftPos + rightPos) / 2;
			
			if (numbers.get(midPos) <= value) {
				largePosition = Math.max(largePosition, midPos);
				leftPos = midPos + 1;
			} else {
				rightPos = midPos - 1;
			}
		}
		
		return largePosition;
	}

	public int getPosGreaterEqual(int value) {
		// The smallest position of an element >= value.
		
		int leftPos = 0;
		int rightPos = numbers.size() - 1;
		int smallPosition = Integer.MAX_VALUE;
		
		while (leftPos <= rightPos) {
			int midPos = (leftPos + rightPos) / 2;
			
			if (numbers.get(midPos) >= value) {
				smallPosition = Math.min(smallPosition, midPos);
				rightPos = midPos - 1;
			} else {
				leftPos = midPos + 1;
			}
		}
		
		return smallPosition;
	}
}

public class Main {
	public static void main(String args[]) throws IOException {
		InputStream inputStream = new FileInputStream("cautbin.in");
		Scanner scanner = new Scanner(inputStream);

		OutputStream outputStream = new FileOutputStream("cautbin.out");
		PrintWriter writer = new PrintWriter(outputStream);

		int N = scanner.nextInt();
		List<Integer> numbers = new ArrayList<Integer>();

		for (int i = 0; i < N; ++i) {
			numbers.add(scanner.nextInt());
		}

		Array array = new Array(numbers);
		int M = scanner.nextInt();

		while (M-- > 0) {
			int type = scanner.nextInt();
			int value = scanner.nextInt();

			switch (type) {
			case 0:
				value = array.getPosEqual(value);
				value = value == -1 ? value : value + 1;
				writer.println(String.valueOf(value));
				break;
			case 1:
				writer.println(String.valueOf(1 + array
						.getPosLesserEqual(value)));
				break;
			case 2:
				writer.println(String.valueOf(1 + array
						.getPosGreaterEqual(value)));
				break;
			}
		}

		writer.flush();
		inputStream.close();
		scanner.close();
		outputStream.close();
		writer.close();
	}
}