Cod sursa(job #831903)

Utilizator matei_cChristescu Matei matei_c Data 9 decembrie 2012 14:18:21
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
 
#define maxn 5000001
 
int n, k ;
int v[maxn] ;
int heap[maxn] ;
int poz[maxn] ;
bool sters[maxn] ;
int nrheap ;
 
void schimba(int a,int b)
{
    swap ( heap[a] , heap[b] ) ;
    poz[ heap[a] ] = a ;
    poz[ heap[b] ] = b ;
}
 
 
void urca(int unde)
{
    while( unde > 1 && v[ heap[unde] ] < v[ heap[ unde / 2 ] ] )
    {
        schimba( unde, unde / 2 ) ;
        unde /= 2 ;
    }
}
 
void coboara(int unde)
{
    int fiust = 2 * unde ;
    int fiudr = 2 * unde + 1 ;
    int ajunge = unde ;
  
    if( fiust <= nrheap && v[ heap[fiust] ] < v[ heap[ajunge] ] )
        ajunge = fiust ;
  
    if( fiudr <= nrheap && v[ heap[fiudr] ] < v[ heap[ajunge] ] )
        ajunge = fiudr ;
  
    if( unde != ajunge )
    {
        schimba( unde, ajunge ) ;
        coboara( ajunge ) ;
    }
 
}
 
int main()
{
     
    freopen("deque.in", "r", stdin);
    freopen("deque.out", "w", stdout);
     
    cin>>n>>k ;
     
    for(int i = 1; i <= n; ++i )
        cin>>v[i] ;
     
    for(int i = 1; i <= k; ++i)
    {   
        heap[++nrheap] = i ;
        poz[i] = nrheap ;
        urca( nrheap ) ;
    }   
     
    long long rez = 0 ;
     
    for(int i = k + 1; i <= n; ++i )
    {
        rez += v[ heap[1] ] ;
         
        heap[++nrheap] = i ;
        poz[i] = nrheap ;
        urca( nrheap ) ;
         
        sters[ i - k ] = true ;
         
        while( sters[ heap[1] ] == true )
        {
            heap[1] = heap[nrheap] ;
            poz[ heap[nrheap] ] = 1 ;
            coboara( 1 ) ;
        }
         
    }   
     
    rez += v[ heap[1] ] ;
     
    cout<<rez ;
     
    return 0;
     
}