Cod sursa(job #1046723)

Utilizator stanescu.raduRadu Stanescu stanescu.radu Data 3 decembrie 2013 13:37:28
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<fstream>
#include<queue>
#include<algorithm>
#include<iostream>

using namespace std;

ifstream f ("deque.in");
ofstream g("deque.out");

queue <int> Qnod,Qpoz;

int n,k,p,i,j,sol,v[5000005],x;

void push(int x, int &k)
{
	v[++k]=x;
	Qnod.push(x);
    if (k == 1) 
	{
		Qpoz.push(k);
		return;
	}
    else
    {
        int i = k;
		
        while (v[i] < v[i/2] && i/2)
        {
            swap(v[i],v[i/2]);
            i = i/2;
        }
		Qpoz.push(i);
    }
}

void pop(int x, int &k)
{
	int i = 1, poz = -1, st, dr;
	
	swap(v[x],v[k]);
	k--;
	
	do
    {
        st = 2*i, dr = 2*i+1;
        poz = -1;
        if (st <= k)
            poz = st;
        if (poz != -1 && dr <= k && v[dr] < v[poz])
            poz = dr;
        if (poz != -1)
        {
            if (v[i] > v[poz])
            {
                swap(v[i],v[poz]);
                i = poz;
            }
            else poz = -1;
        }
    } while (poz != -1);
	
	Qnod.pop();
	Qpoz.pop();
}

int main ()
{
	f >> n >> p;
	for (i = 1; i <= n; i++)
	{
		f >> x;
		push(x,k);
		
		if (i >= p)
		{
			cout<<v[1]<<" ";
			sol += v[1];
			int j=Qpoz.front();
			//for (i = 1; i <= k; i++)
			//	cout << v[i]<<" ";
			//cout<<"\n";
			pop(j,k);
		}
	}
	g<<sol;
	f.close();
	g.close();
	return 0;
}