Mai intai trebuie sa te autentifici.

Cod sursa(job #1277579)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 27 noiembrie 2014 21:00:42
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <stdio.h>
#define NMAX 10000023
FILE *fin, *fout;
int arb[NMAX], n, k, *v;
long long int sum;
int min(int a, int b)
{
    return (a<b)?a:b;
}
void pun(int st, int dr, int val, int poz)
{
     if(st == dr) {arb[poz] = v[val];return;}
     int mij = (st+dr)/2;
     if(val > mij)
     {
            pun(mij+1, dr, val, 2*poz+1);
            arb[poz] = min(arb[2*poz], arb[2*poz + 1]);
     }
     if(val <= mij)
     {
            pun(st, mij, val, 2*poz);
            arb[poz] = min(arb[2*poz], arb[2*poz + 1]);
     }
}
int interogare(int st1, int dr1, int st, int dr, int poz)
{
    if(st1 == st && dr1 == dr) return arb[poz];
    int mij = (st1+dr1)/2;
    if(st > mij) return interogare(mij+1, dr1, st, dr, 2*poz+1);
    if(dr <= mij) return interogare(st1, mij, st, dr, 2*poz);
    return min(interogare(st1, mij, st, mij, 2*poz), interogare(mij+1, dr1, mij+1, dr, 2*poz+1));
}
int main()
{
    fin = fopen("deque.in", "r");
    fout = fopen("deque.out", "w");
    fscanf(fin, "%d%d", &n, &k);
    for(int i =0; i< 2*n+23; i++) arb[i] = NMAX;
    v = new int[n+23];
    for(int i =0; i< n; i++)
    {
            fscanf(fin, "%d", &v[i+1]);
            pun(1, n, i+1, 1);
    }
    for(int i = k; i<= n; i++)
    {
            sum+=(long long int)interogare(1, n, i-k+1, i, 1);
    }
    fprintf(fout, "%lld\n", sum);
    fclose(fin);
    fclose(fout);
    return 0;
}