Cod sursa(job #2344630)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 15 februarie 2019 12:55:58
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;
int v[100001];
pair <int,int> s[100001];
int aint[400001];

map <int,int> mapa;

void add(int nod,int st,int dr,int i,int x)
{
    if(st==dr)
    {
        aint[nod]+=x;
        return ;
    }
    int mid=(st+dr)/2;
    if(i<=mid)
        add(2*nod,st,mid,i,x);
    else
        add(2*nod+1,mid+1,dr,i,x);
    aint[nod]=aint[2*nod]+aint[2*nod+1];
    return ;
}

int query(int nod,int st,int dr,int k)
{
    if(st==dr)
    {
        return st;
    }
    int mid=(st+dr)/2;
    if(aint[2*nod]>=k)
        return query(2*nod,st,mid,k);
    else
        return query(2*nod+1,mid+1,dr,k-aint[2*nod]);
}

int main()
{
    int n,k,i,ct,j,z;
    long long rez=0;
    freopen("pikachu.in","r",stdin);
    freopen("pikachu.out","w",stdout);
    scanf("%d%d",&n,&k);
    for(i=1; i<=n; i++)
    {
        scanf("%d",&s[i].first);
        s[i].second=i;
    }
    sort(s+1,s+1+n);
    for(i=1,ct=1; i<=n; ct++)
    {
        j=i;
        while(j<=n && s[j].first==s[i].first)
        {
            v[s[j].second]=ct;
            mapa[ct]=s[j].first;
            j++;
        }
        i=j;
    }
    for(i=1; i<=k; i++)
        add(1,1,ct,v[i],1);
    z=query(1,1,ct,(k+1)/2);
    rez+=mapa[z];
    for(i=k+1; i<=n; i++)
    {
        add(1,1,ct,v[i-k],-1);
        add(1,1,ct,v[i],1);
        z=query(1,1,ct,(k+1)/2);
        rez+=mapa[z];
    }
    printf("%lld",rez);

    return 0;
}