Pagini recente » Profil angel5 | Rating Octavian Matei (tavis) | Istoria paginii utilizator/otto23 | Cod sursa (job #1813879) | Cod sursa (job #1357543)
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 (position == Integer.MIN_VALUE || 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();
}
}