Cod sursa(job #1068507)

Utilizator Catalina_BrinzaBrinza Catalina Catalina_Brinza Data 28 decembrie 2013 13:53:58
Problema Deque Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
//
//  main.cpp
//  deque+
//
//  Created by Catalina Brinza on 12/25/13.
//  Copyright (c) 2013 Catalina Brinza. All rights reserved.
//

#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");
struct strut
{
    int a,b;
};
strut h[5000001];
int fin(int x,int y)
{
    if (h[x].a<h[y].a) return x;
    else return y;
}

int main()
{
    int s=0,nr=0;
    strut q;

    int n,k,i,x;
    in>>n>>k;

    for (i=1;i<=k;++i)
    {
        
        in>>x;

        nr++;
        q.a=x;
        q.b=i;
        h[nr]=q;
        int fi=nr;
            while (h[fi].a<h[fi/2].a && fi>1)
            {
                swap(h[fi],h[fi/2]);
               
                fi=fi/2;
            }

    }

    s=h[1].a;
    for (i=k+1;i<=n;++i)
    {
    
        in>>x;
        q.a=x;
        q.b=i;
        h[++nr]=q;
        int fi=nr;
        while (h[fi].a<h[fi/2].a && fi>1)
        {
            swap(h[fi],h[fi/2]);
            
            fi=fi/2;
        }
        
        while (!(h[1].b>=i-k+1 && h[1].b<=i))
            {
                while (h[nr].b<i-k+1) nr--;
                swap(h[1],h[nr]);
                nr--;
                int fi=1;
                while(2*fi+1<=nr)
                {
                    int l=fin(2*fi,2*fi+1);
                    if(!(h[fi].a>h[l].a))
                        break;
                    swap(h[fi],h[l]);
                    fi=l;
                }
               
                if (fi*2==nr && h[fi].a>h[fi*2].a) swap(h[fi*2],h[fi]);
              
            }
            s+=h[1].a;
        }

    out<<s;
    in.close();
    out.close();
    return 0;
}