Cod sursa(job #1326604)

Utilizator refugiatBoni Daniel Stefan refugiat Data 25 ianuarie 2015 18:39:21
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.48 kb
#include<algorithm>
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<queue>
using namespace std;
int n=1;
int v[200002];
void sus(int val,int poz)
{
    while(poz>1&&val<v[poz/2])
    {
        v[poz]=v[poz/2];
          //  v[poz/2]=val;
        poz=poz/2;

    }
    v[poz]=val;
}
void inserth(int val)
{
    v[n]=val;
    ++n;
    sus(v[n-1],n-1);
}
int searchh(int val)
{
    queue<int> poz;
    poz.push(1);
    while(poz.size())
    {
        int x=poz.front();
        poz.pop();
        if(v[x]==val)
            return x;
        else
        {
            if(v[x*2]<=val)
                poz.push(x*2);
            if(v[x*2+1]<=val)
                poz.push(x*2+1);
        }
    }
}
void jos(int poz,int val)
{
    while(poz<n)
    {
        if(poz*2<n)
        {
            if(poz*2+1<n)
                if(v[poz*2]<v[poz*2+1])
                {
                    if(val>v[poz*2])
                    {
                        v[poz]=v[poz*2];
                        poz=poz*2;
                    }
                    else
                        break;
                }
                else
                {
                    if(val>v[poz*2+1])
                    {
                        v[poz]=v[poz*2+1];
                        poz=poz*2+1;
                    }
                    else
                        break;
                }
            else
            {
                if(val>v[poz*2])
                {
                    v[poz]=v[poz*2];
                    poz=poz*2;
                }
                else
                    break;
            }
        }
        else
            break;
    }
    v[poz]=val;
}
void deleteh(int poz)
{
    v[poz]=v[n-1];
    --n;
    jos(poz,v[poz]);
}

int main()
{
    ifstream si;
    si.open("heapuri.in");
    ofstream so;
    so.open("heapuri.out");
    int o;
    si>>o;
    int ord[o],m=0;
    while(o--)
    {
        int op;
        si>>op;
        if(op==1)
        {
            int val;
            si>>val;
            ord[m]=val;
            ++m;
            inserth(val);
        }
        else
            if(op==2)
            {
                int val;
                si>>val;
                deleteh(searchh(ord[val-1]));
            }
            else
                so<<v[1]<<'\n';

      /*  int i;
        for(i=1;i<n;++i)
            cout<<v[i]<<' ';
        cout<<endl;*/
    }
}