Cod sursa(job #84524)

Utilizator george_George Guraliuc george_ Data 15 septembrie 2007 21:36:03
Problema Secventa Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <stdio.h>
#define NMAX 500001

int   N, K;
int   A[NMAX], p[NMAX];
int key[NMAX], q[NMAX];
int key_max, l_max, r_max;

inline parent(i) {
    return i >> 1;
}
inline left(i) {
    return i << 1;
}
inline right(i) {
    return (i << 1) | 1;
}

void heapify(int i) {
    int l, r, smallest, tmp;
    l = left(i), r = right(i);
    if (key[i] > key[l] && l <= K)
        smallest = l;
    else
        smallest = i;
    if (key[smallest] > key[r] && r <= K) // ; - this damned semicolon made me waste 4 hours of worthless debug 
        smallest = r;
    while (smallest != i) {
        tmp = key[i], key[i] = key[smallest], key[smallest] = tmp;
        tmp = q[i], q[i] = q[smallest], q[smallest] = tmp;
        p[q[i]] = i, p[q[smallest]] = smallest;
        i = smallest;
        l = left(i), r = right(i);
        if (key[i] > key[l] && l <= K)
            smallest = l;
        else
            smallest = i;
        if (key[smallest] > key[r] && r <= K)
            smallest = r;
    }
}
void heap_build() {
    int i;
    for (i = 1; i <= K; i++) {
        key[i] = A[i];
        p[i] = q[i] = i;
    }
    for (i = K/2; i; i--) {
        heapify(i);
    }
}
void heap_insert(int i) {
    int tmp, x;
    K++;
    key[K] = A[i], q[K] = i, p[i] = K;
    x = K;
    while (key[parent(x)] > key[x] && x > 1) {
        tmp = key[x], key[x] = key[parent(x)], key[parent(x)] = tmp;
        tmp = q[x], q[x] = q[parent(x)], q[parent(x)] = tmp;
        p[q[x]] = x, p[q[parent(x)]] = parent(x);
        x = parent(x);
    }
}
void heap_delete(int i) {
    key[i] = key[K], q[i] = q[K], p[q[i]] = i;
    K--;
    heapify(i);
}
int top() {
    return key[1];
}

int main() {
    int i, j;
    FILE *fi = fopen("secventa.in", "r");
    FILE *fo = fopen("secventa.out", "w");
    fscanf(fi, "%d %d", &N, &K);
    for (i = 1; i <= N; i++)
        fscanf(fi, "%d", &A[i]);
    for (i = 1; i <= N; i++)
        printf("%d ", A[i]);
    heap_build();
    printf("\n\n");
    key_max = top(), l_max = 1, r_max = K;
    for (i = 1; i <= N - K; i++) {
        heap_delete(p[i]);
        heap_insert(i+1+K);
        if (key_max < top())
            key_max = top(), l_max = i+1, r_max = i+K;
    }
    fprintf(fo, "%d %d %d\n", l_max, r_max, key_max);
    fcloseall();
    return 0;
}