Cod sursa(job #1671958)

Utilizator andrei.mardaleAndrei Mardale andrei.mardale Data 2 aprilie 2016 11:46:41
Problema Cautare binara Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 2.2 kb
package cautbin;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;

public class Main {
	static int n;
	static int[] v;
	
	public static int read (BufferedReader br) throws IOException{
		String line = br.readLine();
		int m;
		n = Integer.valueOf(line.trim());
		v = new int[n];
		int i = 0;
		line = br.readLine();
		String[] splitted = line.split("\\s+");
		for (String s : splitted){
			v[i++] = Integer.valueOf(s);
		}
		line = br.readLine();
		m = Integer.valueOf(line.trim());

		return m;
	}
	
	public static int binSearch (int x, int st, int en){
		int mid;
		while (st < en-1){
			mid = st + (en - st) /2;
			if (v[mid] == x){
				if (v[mid+1] == x){
					st = mid;
				}
				else {
					return mid+1;
				}
			}
			
			if (v[mid] < x){
				st = mid;
			}
				
			if (v[mid] > x){
				en = mid;
			}
		}
		return -1;
	}
	
	public static int binSearch2 (int x, int st, int en){
		int mid;
		while (st < en-1){
			mid = st + (en - st) /2;
			if (v[mid] <= x){
				if (v[mid+1] <= x){
					st = mid;
				}
				else {
					return mid+1;
				}
			}
			
			if (v[mid] < x){
				st = mid;
			}
				
			if (v[mid] > x){
				en = mid;
			}
		}
		return -1;
	}
	
	public static int binSearch3 (int x, int st, int en){
		int mid;
		while (st < en-1){
			mid = st + (en - st) /2;
			if (v[mid] >= x){
				if (v[mid-1] >= x){
					en = mid;
				}
				else {
					return mid+1;
				}
			}
			
			if (v[mid] < x){
				st = mid;
			}
				
			if (v[mid] > x){
				en = mid;
			}
		}
		return -1;
	}
	
	public static void main(String[] args) throws IOException{
		
		BufferedReader br = new BufferedReader(new FileReader("cautbin.in"));
		PrintWriter pw = new PrintWriter("cautbin.out");
		int m = read(br);
		String line;
		String[] splitted;
		for (int i = 0; i < m; i++){
			line = br.readLine();
			splitted = line.split("\\s+");
			int type = Integer.parseInt(splitted[0]);
			int x = Integer.parseInt(splitted[1]);
			if (type == 0)
				pw.write(String.valueOf(binSearch(x, 0, n) + "\n"));
			if (type == 1)
				pw.write(String.valueOf(binSearch2(x, 0, n) + "\n"));
			if (type == 2)
				pw.write(String.valueOf(binSearch3(x, 0, n) + "\n"));
		}
		
		
		pw.close();
		br.close();
	}
	

}