Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- struct elem
- {
- int k;
- char w[10];
- struct elem **next;
- int *span;
- }**p, *l;
- int *arr;
- struct elem *Succ(struct elem *x)
- {
- return x->next[0];
- }
- void skip(int m, int k, struct elem **p)
- {
- struct elem *x = l;
- int i = m - 1;
- while (i >= 0)
- {
- arr[i] = i;
- if(arr[i] == m-1) arr[i] = 0;
- else arr[i] = arr[i+1];
- while (x->next[i] != NULL && x->next[i]->k < k)
- {
- arr[i] = arr[i] + x->span[i];
- x = x->next[i];
- }
- p[i] = x;
- i--;
- }
- }
- void Lookup(int m, int k)
- {
- p = (struct elem**)malloc(m * sizeof(struct elem*));
- struct elem *x;
- skip(m, k, p);
- x = Succ(p[0]);
- printf("%s\n", x->w);
- free(p);
- }
- void Insert(int m, int k)
- {
- p = (struct elem**)malloc(m * sizeof(struct elem*));
- skip(m, k, p);
- struct elem *x = (struct elem*)malloc(m * sizeof(struct elem));
- x->next = (struct elem**)malloc(m * sizeof(struct elem*));
- x->span = (int*)malloc(m * sizeof(int));
- int i = 0;
- while (x < m)
- {
- x->next[i] = NULL;
- i++;
- }
- x->k = k;
- scanf("%s", x->w);
- int r = rand()*2;
- i = 0;
- while (i < m && r%2 == 0)
- {
- x->next[i] = p[i]->next[i];
- p[i]->next[i] = x;
- x->span[i] = p[i]->span[i] - arr[0] + arr[i];
- p[i]->span[i] = arr[0] - arr[i] + 1;
- i++;
- r = r/2;
- }
- while (i < m)
- {
- x->next[i] = NULL;
- p[i]->span[i]++;
- i++;
- }
- free(p);
- }
- void rank(int m, int k)
- {
- int i = m-1;
- int r = 0;
- struct elem * x;
- x = l;
- while(i >= 0)
- {
- while(x->next[i] != NULL && k > x->next[i]->k)
- {
- r += x->span[i];
- x = x->next[i];
- }
- i--;
- }
- printf("%d\n", r);
- }
- void delete(int m, int k)
- {
- p = (struct elem**)malloc(m * sizeof(struct elem*));
- skip(m, k, p);
- struct elem *x = Succ(p[0]);
- int i = 0;
- while (i < m && p[i]->next[i] == x)
- {
- p[i]->span[i] += x->span[i] - 1;
- p[i]->next[i] = x->next[i];
- i++;
- }
- while (i < m)
- {
- p[i]->span[i]--;
- i++;
- }
- free(p);
- free(x->span);
- free(x->next);
- free(x);
- }
- int check(int m, char*s)
- {
- int k;
- if (s[0] == 'I')
- {
- scanf("%d", &k);
- Insert(m, k);
- return 0;
- }
- if (s[0] == 'L')
- {
- scanf("%d", &k);
- Lookup(m, k);
- return 0;
- }
- if (s[0] == 'D')
- {
- scanf("%d", &k);
- delete(m, k);
- return 0;
- }
- if (s[0] == 'R')
- {
- scanf("%d", &k);
- rank(m, k);
- return 0;
- }
- }
- int main()
- {
- int n;
- scanf("%d", &n);
- int m = log2(n) + 1;
- arr = (int*)malloc(m * sizeof(int));
- l = (struct elem*)malloc(m * sizeof(struct elem));
- l->next = (struct elem**)malloc(m * sizeof(struct elem*));
- l->span = (int*)malloc(m * sizeof(int));
- int i = 0;
- while (i < m)
- {
- l->next[i] = NULL;
- i++;
- }
- for (int i = 0; i < n; i++)
- {
- char s[7];
- scanf("%s", s);
- check(m, s);
- }
- free(arr);
- struct elem *t;
- while(l != NULL)
- {
- t = l->next[0];
- free(l->span);
- free(l->next);
- free(l);
- l = t;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement