Pagini recente » Cod sursa (job #2353161) | Cod sursa (job #3180570) | Cod sursa (job #959490) | Cod sursa (job #2519352) | Cod sursa (job #589348)
Cod sursa(job #589348)
#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(int));
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;
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(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);
}