Cod sursa(job #3257271)

Utilizator Laura139Anghel Laura Laura139 Data 17 noiembrie 2024 11:18:51
Problema Submultimi Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <cmath>

using namespace std;

ifstream cin("pikachu.in");
ofstream cout("pikachu.out");

long long a[20005];
int s[10005], v[10005];

int n;

void initializare(int nod, int st, int dr)
{
    if(st==dr)
    {
        if(st<=n)
            a[nod]=v[st];
        return;
    }
    int med=(st+dr)/2;
    initializare(2*nod, st, med);
    initializare(2*nod+1, med+1, dr);
}

void update(int nod, int st, int dr, int val, int ust, int udr)
{
    if(st==dr && ust<=st && udr>=st)
    {
        if(st<=n)
            a[nod]=abs(v[st]-val);
        return;
    }
    int med=(st+dr)/2;
    if(med>=ust)
        update(2*nod, st, med, val, ust, udr);
    if(med<udr)
        update(2*nod+1, med+1, dr, val, ust, udr);
    a[nod]=a[2*nod]+a[2*nod+1];
}

long long query(int nod, int st, int dr, int qst, int qdr)
{
    if(st>=qst && dr<=qdr)
    {
        return a[nod];
    }
    int med=(st+dr)/2;
    long long sum=0;
    if(med>=qst)
        sum+=query(2*nod, st, med, qst, qdr);
    if(med<qdr)
        sum+=query(2*nod+1, med+1, dr, qst, qdr);
    return sum;
}

int main()
{
    int k;
    cin>>n>>k;
    int m=pow(2, floor(log2(n))+!(log2(n)==floor(log2(n))));
    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
        s[i]=s[i-1]+v[i];
    }
    initializare(1,1,m);

    /*for(int i=1;i<2*m;i++)
            cout<<a[i]<<" ";
        cout<<'\n';*/

    long long minim=1e18;
    for(int i=1;i+k-1<=n;i++)
    {
        long long mij=(s[i+k-1]-s[i-1])/k;
        //cout<<mij<<'\n';
        update(1,1,m,mij,i, i+k-1);
        /*for(int i=1;i<2*m;i++)
            cout<<a[i]<<" ";
        cout<<'\n';*/
        minim=min(minim, query(1,1,m, i, i+k-1));
    }
    cout<<minim<<'\n';
    return 0;
}