Cod sursa(job #1059014)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 16 decembrie 2013 01:27:58
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<algorithm>
#include<fstream>
#define maxn 5000001
using namespace std;
ifstream fi("deque.in");
ofstream fo("deque.out");
 
int g,poz[maxn],a[maxn],k=0,n=0,r;
int i,t,x,heap[maxn];
long long s=0;
 
void downheap(int n,int x){
     int y=0;
     
     while(x!=y)
     {
      y=x;
      
      if(2*y<=n && a[heap[x]]>a[heap[2*y]]) x=2*y;
      if(2*y+1<=n && a[heap[x]]>a[heap[2*y+1]]) x=2*y+1;
      
      swap(heap[x],heap[y]);
      poz[heap[x]]=x;
      poz[heap[y]]=y;
     }
}
 
void upheap(int nod){
     
     while(nod>1 && a[heap[nod]]<a[heap[nod/2]])
     {
      swap(heap[nod],heap[nod/2]);
      
      poz[heap[nod]]=nod;
      poz[heap[nod/2]]=nod/2;
      
      nod/=2;
     }
}
 
void insertheap(int &n,int x){
     n++; k++;
     a[k]=x;// valoarea celui de al k element intr. cronologic
     heap[n]=k;//in nodul n din heap se afla cel de al k element intr. cronologic
     poz[k]=n;//pozitia celui de al k element intr. cronologic in heap
     upheap(n);
}
 
void deleteheap(int &n,int x){
     a[x]=-1;
     upheap(poz[x]);
     poz[heap[1]]=0;
     heap[1]=heap[n--];
     poz[heap[1]]=1;
     downheap(n,1);
}
 
int main(){
    fi>>r>>g;

    for(i=1;i<g;i++){ fi>>x; insertheap(n,x); }

    for(;i<=r;i++){
                   fi>>x;
                   insertheap(n,x);
                   s+=a[heap[1]];
                   while(heap[1]<=i-g+1) deleteheap(n,i-g+1);
                  }
    fo<<s;
    fi.close();
    fo.close();
    return 0;
}