Cod sursa(job #1060846)

Utilizator myshuSpatariu Mihai-Constantin myshu Data 18 decembrie 2013 20:28:35
Problema Deque Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
using namespace std;
int p=0,v[5000001],w[5000001],k;
long long s=0;
void add(int x,int i)
{
	v[++p]=x;
	w[p]=i;
	int t=p;
	if(t/2>0)while(v[t]<v[t/2])
	{
		v[t]=v[t/2]+v[t];
		v[t/2]=v[t]-v[t/2];
		v[t]=v[t]-v[t/2];
		w[t]=w[t/2]+w[t];
		w[t/2]=w[t]-w[t/2];
		w[t]=w[t]-w[t/2];
		t=t/2;
		if(t/2<=0)break;
	}
	while(w[1]<=i-k)
	{
		v[1]=v[p];
		w[1]=w[p];
		p--;t=1;
		if(2*t+1<=p)
		while(v[t]>v[2*t]||v[t]>v[2*t+1])
			if(v[2*t]<v[2*t+1])
			{	v[t]=v[t]+v[t*2];
			    v[t*2]=v[t]-v[2*t];
				v[t]=v[t]-v[2*t];
				w[t]=w[t]+w[t*2];
			    w[t*2]=w[t]-w[2*t];
				w[t]=w[t]-w[2*t];
				t=t*2;
				if(t*2+1>p)break;
			}
			else
			{	v[t]=v[t]+v[t*2+1];
			    v[t*2+1]=v[t]-v[2*t+1];
				v[t]=v[t]-v[2*t+1];
				w[t]=w[t]+w[t*2+1];
			    w[t*2+1]=w[t]-w[2*t+1];
				w[t]=w[t]-w[2*t+1];
				t=t*2+1;
				if(2*t+1>p)break;
			}
		if(2*t==p&&v[t]>v[2*t])
			{	v[t]=v[t]+v[t*2];
			    v[t*2]=v[t]-v[2*t];
				v[t]=v[t]-v[2*t];
				w[t]=w[t]+w[t*2];
			    w[t*2]=w[t]-w[2*t];
				w[t]=v[t]-w[2*t];
				t=t*2;
			}
	}
	if(i>=k)
	{
		s=s+v[1];
	}
}
int main()
{
	ifstream fcin("deque.in");
	ofstream fcout("deque.out");
	int n,i,x;
	fcin>>n>>k;
	for(i=1;i<=n;i++)
		{fcin>>x;
		 add(x,i);
		 }
	fcout<<s<<'\n';
	return 0;
}