Pagini recente » Cod sursa (job #42094) | Cod sursa (job #2102301) | Cod sursa (job #2626149) | Cod sursa (job #1883022) | Cod sursa (job #589483)
Cod sursa(job #589483)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define H_MAX 40
struct nod {
int val;
nod **link;
nod(int x, int h) {
link = (nod**)malloc((h+1)*sizeof(nod*));
val = x;
memset(link, 0 ,sizeof(link));
}
};
nod *START = new nod(0, H_MAX);
nod *path[H_MAX];
int H;
int n, k;
nod * find_value(int k) {
nod *x = START;
for(int i = H; i >= 0; --i) {
path[i] = 0;
for(;x->link[i] && x->link[i]->val < k; x = x->link[i]);
path[i] = x;
}
return x;
}
inline int GetH() {
int h = 0;
for(int r = rand(); h <= H && (r&1); h++, r/= 2);
for(int r = rand(); h <= H && (r&1); h++, r/= 2);
if(h > H) h = ++H;
return h;
}
void add(int val) {
int h = GetH();
nod *node = new nod(val, h);
find_value(val);
for(int i = 0; i <= h; ++i) {
node->link[i] = path[i]->link[i];
path[i]->link[i] = node;
}
}
int main() {
srand(time(NULL));
freopen("sdo.in" ,"r", stdin);
freopen("sdo.out" ,"w", stdout);
scanf("%d%d", &n, &k);
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");*/
//for(int i = 1; i <= n; ++i)
// find_index(i);
nod *x = START; int c = 0;
while(c < k) {
c ++;
x = x->link[0];
}
printf("%d\n", x->val);
}