Pagini recente » Cod sursa (job #382779) | Cod sursa (job #202834) | Cod sursa (job #1639615) | Cod sursa (job #632313) | Cod sursa (job #766786)
Cod sursa(job #766786)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector<int> Q;
vector<int> val;
vector<int> heapIndex;
void push(int k,int index)
{
Q.push_back(k);
int p = (index-1)>>1;
while (index>0 && val[Q[p]]>val[Q[index]])
{
int swapp = Q[index];
Q[index] = Q[p];
Q[p]=swapp;
heapIndex[Q[index]] = index;
index = p;
p = (index-1)>>1;
}
heapIndex[Q[index]] = index;
}
int pop(int index)
{
int p = Q[index];
Q[index]=Q[Q.size()-1];
heapIndex[Q[index]]=index;
Q.pop_back();
int minindex;
bool swap;
while(true){
minindex = index;
int left = (index<<1)+1;
int right = left+1;
if (left<Q.size() && val[Q[left]]<val[Q[index]])
minindex = left;
if (right<Q.size() &&val[Q[right]]<val[Q[minindex]])
minindex = right;
if (minindex!=index)
{
int swapp = Q[minindex];
Q[minindex] = Q[index];
Q[index] = swapp;
heapIndex[Q[index]] = index;
heapIndex[Q[minindex]] = minindex;
swap = true;
}
else return p;
index = minindex;
};
return 0;
}
int main()
{
FILE* f = fopen("heapuri.in","r");
FILE* g = fopen("heapuri.out","w+");
int n;
fscanf(f,"%d", &n);
int order=0;
for (int i=0;i<n;i++)
{
int op,x;
fscanf(f,"%d", &op);
switch (op)
{
case 1:
{
fscanf(f,"%d", &x);
val.push_back(x);
heapIndex.push_back(Q.size());
push(val.size()-1,Q.size());
break;
}
case 2:
fscanf(f,"%d", &x);
pop(heapIndex[x-1]);
break;
case 3:
fprintf(g,"%d\n",val[Q.front()]);
break;
default:
break;
}
}
fclose(f);
fclose(g);
}