Cod sursa(job #543170)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 27 februarie 2011 17:40:21
Problema Deque Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<iostream.h>
#include<fstream.h>
#include<stdio.h>
#define N 5000001
typedef struct deque
{long elem[N],nel,prim,ultim;};
long a,n,k,i,j,b[N];
long long s=0;
deque q;

void addEnd(deque &q,long x)
{q.nel++;
q.elem[q.ultim++]=x;}

long delBeg(deque &q)
{q.nel--;
return q.elem[q.prim++];}

long delEnd(deque &q)
{q.nel--;
return q.elem[--q.ultim];}

int main()
{q.nel=q.prim=q.ultim=0;
freopen("deque.in","r",stdin);
ofstream f2("deque.out");
scanf("%ld%ld\n",&n,&k);
for(i=1;i<=n;i++)
      {scanf("%ld\n",&a);
      while(q.nel!=0&&a<q.elem[q.ultim-1])
             delEnd(q);
      addEnd(q,a);
      if(q.nel==1)
             b[q.prim]=1;
      else
             {j=q.prim;
             while(j<q.ultim-1)
                     {b[j]++;
                     j++;}
             b[q.ultim-1]=1;}
      b[q.ultim]=0;
      if(((q.nel==1&&q.prim==i-k)||(q.prim<i-k&&q.nel<k)||(i==k&&b[q.prim]>1))&&b[q.prim]<k)
             s+=q.elem[q.prim];
      else
             if(q.nel==k||b[q.prim]==k||q.prim==i-k||(i==k&&b[q.prim]==1))
                   s+=delBeg(q);}
f2<<s;
fclose(stdin);
f2.close();
return 0;}