Cod sursa(job #1486470)

Utilizator tanduraDomnita Dan tandura Data 14 septembrie 2015 21:47:09
Problema Heapuri Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 2.95 kb
import java.io.*;
import java.util.Scanner;
import java.io.PrintWriter;
import java.util.NoSuchElementException;

public class Main 
{
	private static int[] heap = new int[200001];
	private static int[] cronologic = new int[200001];
	private static int[] poz = new int[200001];
	private static int size = 0;
	private static int n; //nr operatii
	private static int x;
	private static int tip;
	
	private static int father(int v)
	{
		return v/2;
	}
	
	private static int left_son(int v)
	{
		return v*2;
	}
	
	private static int right_son(int v)
	{
		return v*2 + 1;
	}
	
	private static void sift(int v)
	{
		int son;
		do
		{	
			son = 0;
			if(left_son(v)<=size)
			{
				son = left_son(v);
				if(right_son(v)<=size && cronologic[heap[right_son(v)]]> cronologic[heap[son]])
					son = right_son(v);
			}
			if(son != 0 && cronologic[heap[v]] > cronologic[heap[son]])
			{
				int aux = heap[v]; //interschimbare in heap a poz din cronologic a nr
				heap[v]=heap[son];
				heap[son] = aux;
				
				aux = poz[heap[v]];  //interschimbare a poz catre loc din heap
				poz[heap[v]] = poz[heap[son]];
				poz[heap[son]] = aux;
				v = son;
			}
		}while(son!=0);
	}
	
	private static void percolate(int v)
	{
		int parinte;
		parinte = father(v);
		if(parinte>=1 && cronologic[heap[parinte]] > cronologic[heap[v]])
		{
			int aux = heap[v];  //interschimbare in heap a poz din cronologic a nr
			heap[v]=heap[parinte];
			heap[parinte] = aux;
			
			aux = poz[heap[v]];  //interschimbare a poz catre loc din heap
			poz[heap[v]] = poz[heap[parinte]];
			poz[heap[parinte]] = aux;
			
			percolate(parinte);
		}
	}
	
	private static void add(int val,int index)
	{
		cronologic[index] = val;
		heap[++size] = index;
		poz[index]=size;
		percolate(size);
	}
	
	private static void cut(int v)
	{
		if(poz[v]==size)
			size--;
		else
		{
			heap[poz[v]]=heap[size--];
			if(poz[v]>1 && cronologic[heap[father(poz[v])]] > cronologic[heap[poz[v]]])
				percolate(poz[v]);
			else
				sift(poz[v]);
		}
	}
	
	public static void main(String[] args)throws IOException
	{
	    int indexCronologic=0;
		Scanner f = new Scanner(new File("heapuri.in"));
	    PrintWriter g = new PrintWriter(new File("heapuri.out"));
	    n = f.nextInt();
	    tip = 0;
	    for(int i=1;i<=n;i++)
	    {
	    	try
	    	{
	    		tip = f.nextInt();
		    	switch(tip)
		    	{
		    		case 1:
		    		{
		    			x = f.nextInt();
		    			indexCronologic++;
		    			add(x,indexCronologic);
		    			break;
		    		}
		    		case 2:
		    		{
		    			x = f.nextInt();
		    			cut(x);
		    			break;
		    		}
		    		case 3:
		    		{
		    			g.write(cronologic[heap[1]] + "\n");
		    			break;
		    		}
		    		
		    	}
	    	}
	    	catch(NoSuchElementException e)
	    	{
	    		System.out.println("NoSuchElementException, the line was: " + f);
	    	}
	    }
	    f.close();
	    g.close();
	}
    
 
}