문제

코드
import java.io.*;
public class q11286 {
static int naturalHeapSize = 0;
static int unnaturalHeapSize = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int[] naturalHeap = new int[100000];
int[] unnaturalHeap = new int[100000];
int N = Integer.parseInt(br.readLine());
for(int i=0; i<N; i++) {
int input = Integer.parseInt(br.readLine());
if(input > 0) {
insertNode(naturalHeap, unnaturalHeap, input, true);
}
else if(input < 0) {
insertNode(naturalHeap, unnaturalHeap, input, false);
}
else bw.write(select(naturalHeap, unnaturalHeap) + "\n");
}
bw.flush();
}
public static void insertNode(int[] naturalHeap, int[] unnaturalHeap, int v, boolean isNatural) {
if(isNatural) {
naturalHeap[++naturalHeapSize] = v;
if(naturalHeapSize == 1) return;
else {
int presentNodeIndex = naturalHeapSize;
while(true) {
int parentNodeIndex = presentNodeIndex / 2;
if(parentNodeIndex == 0) break;
if(naturalHeap[presentNodeIndex] < naturalHeap[parentNodeIndex]) {
swapNode(naturalHeap, presentNodeIndex, parentNodeIndex);
presentNodeIndex = parentNodeIndex;
} else {
break;
}
}
}
}
else {
unnaturalHeap[++unnaturalHeapSize] = v;
if(unnaturalHeapSize == 1) return;
else {
int presentNodeIndex = unnaturalHeapSize;
while(true) {
int parentNodeIndex = presentNodeIndex / 2;
if(parentNodeIndex == 0) break;
if(unnaturalHeap[presentNodeIndex] > unnaturalHeap[parentNodeIndex]) {
swapNode(unnaturalHeap, presentNodeIndex, parentNodeIndex);
presentNodeIndex = parentNodeIndex;
} else {
break;
}
}
}
}
}
public static int select(int[] naturalHeap, int[] unnaturalHeap) {
int rootNode = 0;
int naturalHeapRoot;
int unnaturalHeapRoot;
if(naturalHeapSize == 0) naturalHeapRoot = 0;
else naturalHeapRoot = naturalHeap[1];
if(unnaturalHeapSize == 0) unnaturalHeapRoot = 0;
else unnaturalHeapRoot = unnaturalHeap[1];
if(naturalHeapRoot == 0 && unnaturalHeapRoot == 0) rootNode = 0;
else if(naturalHeapRoot == 0) {
rootNode = unnaturalHeapRoot;
popUnnaturalRoot(unnaturalHeap);
}
else if(unnaturalHeapRoot == 0) {
rootNode = naturalHeapRoot;
popNaturalRoot(naturalHeap);
}
else {
if(Math.abs(naturalHeapRoot) < Math.abs(unnaturalHeapRoot)) {
rootNode = naturalHeapRoot;
popNaturalRoot(naturalHeap);
}
else {
rootNode = unnaturalHeapRoot;
popUnnaturalRoot(unnaturalHeap);
}
}
return rootNode;
}
public static int popNaturalRoot(int[] naturalHeap) {
int rootNode = naturalHeap[1];
naturalHeap[1] = naturalHeap[naturalHeapSize--];
int presentNodeIndex = 1;
while(true) {
int childNodeIndex1 = presentNodeIndex * 2;
int childNodeIndex2 = presentNodeIndex * 2 + 1;
int changeNodeIndex;
if(childNodeIndex1 > naturalHeapSize) break;
if(childNodeIndex2 > naturalHeapSize) {
changeNodeIndex = childNodeIndex1;
}
else {
if(naturalHeap[childNodeIndex1] < naturalHeap[childNodeIndex2]) changeNodeIndex = childNodeIndex1;
else changeNodeIndex = childNodeIndex2;
}
if(naturalHeap[presentNodeIndex] > naturalHeap[changeNodeIndex]) {
swapNode(naturalHeap, presentNodeIndex, changeNodeIndex);
presentNodeIndex = changeNodeIndex;
} else {
break;
}
}
return rootNode;
}
public static int popUnnaturalRoot(int[] unnaturalHeap) {
int rootNode = unnaturalHeap[1];
unnaturalHeap[1] = unnaturalHeap[unnaturalHeapSize--];
int presentNodeIndex = 1;
while(true) {
int childNodeIndex1 = presentNodeIndex * 2;
int childNodeIndex2 = presentNodeIndex * 2 + 1;
int changeNodeIndex;
if(childNodeIndex1 > unnaturalHeapSize) break;
if(childNodeIndex2 > unnaturalHeapSize) {
changeNodeIndex = childNodeIndex1;
}
else {
if(unnaturalHeap[childNodeIndex1] > unnaturalHeap[childNodeIndex2]) changeNodeIndex = childNodeIndex1;
else changeNodeIndex = childNodeIndex2;
}
if(unnaturalHeap[presentNodeIndex] < unnaturalHeap[changeNodeIndex]) {
swapNode(unnaturalHeap, presentNodeIndex, changeNodeIndex);
presentNodeIndex = changeNodeIndex;
} else {
break;
}
}
return rootNode;
}
public static void swapNode(int[] minHeap, int aNodeIndex, int bNodeIndex) {
int tempV = minHeap[aNodeIndex];
minHeap[aNodeIndex] = minHeap[bNodeIndex];
minHeap[bNodeIndex] = tempV;
}
}