/**************************************************************************************************************
* Md. Abdulla Al Mamun (Nayon)
* ID: 1306001
* Session: 2013-2014
* Department of Computer Science and Engineering
* Begum Rokeya University, Rangpur (BRUR)
***************************************************************************************************************/
#include <stdio.h>
#define MAX 10000
#define swap(typeName, a, b) {typeName _tmp = a; a = b; b = _tmp;}
int maxHeap[MAX], minHeap[MAX];
int maxHeapSize, minHeapSize, maxHeapArrayLength, minHeapArrayLength;
void maxHeapify(int node)
{
int largestNode = node;
int lftNode = node*2;
int ritNode = lftNode+1;
if(lftNode <= maxHeapSize && maxHeap[lftNode] > maxHeap[largestNode]){
largestNode = lftNode;
}
if(ritNode <= maxHeapSize && maxHeap[ritNode] > maxHeap[largestNode]){
largestNode = ritNode;
}
if(largestNode != node){
swap(int, maxHeap[largestNode], maxHeap[node]);
maxHeapify(largestNode);
}
}
void minHeapify(int node)
{
int smallestNode = node;
int lftNode = node*2;
int ritNode = lftNode+1;
if(lftNode <= minHeapSize && minHeap[lftNode] < minHeap[smallestNode]){
smallestNode = lftNode;
}
if(ritNode <= minHeapSize && minHeap[ritNode] < minHeap[smallestNode]){
smallestNode = ritNode;
}
if(smallestNode != node){
swap(int, minHeap[smallestNode], minHeap[node]);
minHeapify(smallestNode);
}
}
void maxHeapMaintain()
{
maxHeapSize = maxHeapArrayLength;
int node;
for(node = maxHeapSize/2; node >= 1; node--){
maxHeapify(node);
}
}
void minHeapMaintain()
{
minHeapSize = minHeapArrayLength;
int node;
for(node = minHeapSize/2; node >= 1; node--){
minHeapify(node);
}
}
int main(int argc, char* argv[])
{
int n;
maxHeapArrayLength = minHeapArrayLength = 0;
double median = 0;
int dataNo = 0;
int prev;
while(scanf("%d", &n
) != EOF
){ dataNo++;
if(dataNo <= 2){//if total input data is less than or equal to 2
if(dataNo == 1){//first input is itself a median
prev = n;
}
else if(dataNo == 2){//if total input is 2
median = (prev+n)/2.0;
if(prev > n){
maxHeap[1] = n;
minHeap[1] = prev;
}
else{
maxHeap[1] = prev;
minHeap[1] = n;
}
maxHeapArrayLength++;
minHeapArrayLength++;
}
continue;
}
if(n < maxHeap[1]){//if input n is less than root of the maxHeap then push it to maxHeap
maxHeapArrayLength++;
maxHeap[maxHeapArrayLength] = n;
maxHeapMaintain();
}
else{//if input n is greater than or equal root of the maxHeap then push it to minHeap
minHeapArrayLength++;
minHeap[minHeapArrayLength] = n;
minHeapMaintain();
}
//balancing the heaps
if(maxHeapSize - minHeapSize >= 2){
while(maxHeapSize-minHeapSize >= 2){
minHeapArrayLength++;
minHeap[minHeapArrayLength] = maxHeap[1];
minHeapMaintain();
swap(int, maxHeap[1], maxHeap[maxHeapArrayLength]);
maxHeapArrayLength--;
maxHeapMaintain();
}
}
else if(minHeapSize - maxHeapSize >= 2){
while(minHeapSize-maxHeapSize >= 2){
maxHeapArrayLength++;
maxHeap[maxHeapArrayLength] = minHeap[1];
maxHeapMaintain();
swap(int, minHeap[1], minHeap[minHeapArrayLength]);
minHeapArrayLength--;
minHeapMaintain();
}
}
//claculating median
if((maxHeapSize+minHeapSize)%2 == 1){
if(maxHeapSize > minHeapSize)
median = maxHeap[1];
else if(maxHeapSize < minHeapSize)
median = minHeap[1];
}
else{
median = (maxHeap[1]+minHeap[1])/2.0;
}
}
return 0;
}