Cod sursa(job #589231)

Utilizator adelinasAdelina Spataru adelinas Data 11 mai 2011 16:20:08
Problema Statistici de ordine Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define H_MAX 40
struct nod {
    int val;
    nod **link;
    int *jump;
    nod(int x, int h) {
        link = (nod**)malloc((h+1)*sizeof(nod));
        jump = (int*)malloc((h+1)*sizeof(nod));
        val = x;
        memset(link, 0 ,sizeof(link));
        memset(jump, 0, sizeof(jump));
    }
};
nod *START = new nod(0, H_MAX);
int jumped[H_MAX];
nod *path[H_MAX];
int H;
int n, k;
nod * find_index(int k) {
    nod *x = START;
    for(int i = H; i >= 0; --i) {
        jumped[i] = 0; path[i] = 0;
        for(;x->link[i] && x->jump[i] < k; x = x->link[i])
            k -= x->jump[i], jumped[i] += x->jump[i];
        path[i] = x;
    }
    return x;
}
nod * find_value(int k) {
    nod *x = START;
    for(int i = H; i >= 0; --i) {
        jumped[i] = 0; path[i] = 0;
        for(;x->link[i] && x->link[i]->val < k; x = x->link[i])
            jumped[i] += x->jump[i];
        path[i] = x;
    }
    return x;
}
inline int GetH() {
    int h = 0;
    /*for(int r = rand(); h <= H && (r&1); h++, r/= 2);
    if(h > H) h = ++H;*/
    while(h < H && rand()%2) h++;
    return h;
}
void add(int val) {
    int h = GetH();
    nod *node = new nod(val, h);
    find_value(val);
    for(int i = h+1; i <= H; ++i)
        path[i]->jump[i]++;
    int d = 0;
    for(int i = 0; i <= h; ++i) {
        node->link[i] = path[i]->link[i];
        path[i]->link[i] = node;

        node->jump[i] = path[i]->jump[i] - d;
        path[i]->jump[i] = d+1;

        d += jumped[i];
    }
}
int main() {
    srand(time(NULL));
    freopen("sdo.in" ,"r", stdin);
    freopen("sdo.out" ,"w", stdout);
    scanf("%d%d", &n, &k);
    for(; (1<<H) <= n; H++);
    for(int i = 1;  i <= n; ++i) {
        int x;
        scanf("%d", &x);
        add(x);
    }
   /* nod *x = START->link[0];
   while(x) {
        printf("%d ", x->val);
        x = x->link[0];
    }
    printf("\n");*/
    printf("%d\n", find_index(k)->link[0]->val);
}