Cod sursa(job #1044383)

Utilizator Catalina_BrinzaBrinza Catalina Catalina_Brinza Data 29 noiembrie 2013 18:53:18
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
//
//  main.cpp
//  heapuri
//
//  Created by Catalina Brinza on 11/29/13.
//  Copyright (c) 2013 Catalina Brinza. All rights reserved.
//

#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
    vector<int> a;
int cautare(int x,int n)
{int k, pos=1<<30;
    for (k=0;pos!=0;pos=pos/2)
        if (k+pos<=n && a[k+pos]<x) k+=pos;
    return k+1;
    
}
int main()
{int n,i,ji,x,aux,y,w,m;
    vector<int> intrare;
    f>>m;
 
    a.push_back(0);
    intrare.push_back(0);
    n=0;
    for(i=0;i<m;++i)
    {
        f>>w;
     
        if (w==3) g<<a[1]<<"\n";
        else
        {
            f>>y;
            if (w==1)
            {++n;
                intrare.push_back(y);
            a.push_back(y);
            int in=n;
            while (a[in]<a[in/2])
            {
                aux=a[in];
                a[in]=a[in/2];
                a[in/2]=aux;
                in=in/2;
            }}
            else
            {
                x=intrare[y];
                y=cautare(x,n);
                a[y]=a[n];
                a.pop_back();
                --n;
                ji=y;
                if (ji*2+1<=n)
                    while (ji*2+1<=n)
                    {
                        if (a[ji]>a[ji*2] && a[ji*2]<a[ji*2+1])
                        {
                            aux=a[ji];
                            a[ji]=a[ji*2];
                            a[ji*2]=aux;
                            ji=ji*2;
                            
                        }
                        else if (a[ji]>a[ji*2+1] && a[ji*2+1]<=a[ji*2])
                        {
                            aux=a[ji];
                            a[ji]=a[ji*2+1];
                            a[ji*2+1]=aux;
                            ji=ji*2+1;
                        }
                        else break;
                        if (ji==n) break;
                    }
                else if (ji*2==n && a[ji]>a[ji*2])
                {
                    aux=a[ji];
                    a[ji]=a[ji*2];
                    a[ji*2]=aux;
                    
                }
            }
            }
        }
    return 0;
}