結果
| 問題 | No.649 ここでちょっとQK! |
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2018-10-07 12:18:49 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 189 ms / 3,000 ms |
| コード長 | 3,848 bytes |
| 記録 | |
| コンパイル時間 | 241 ms |
| コンパイル使用メモリ | 31,232 KB |
| 実行使用メモリ | 17,408 KB |
| 最終ジャッジ日時 | 2024-10-12 14:12:36 |
| 合計ジャッジ時間 | 4,440 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
ソースコード
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct AVLTreeNode{
void *val;
int size;
int rank;
int bias;
struct AVLTreeNode *left;
struct AVLTreeNode *right;
} AVLNode;
typedef struct AVLTreeHead{
AVLNode *root;
size_t valSize;
int (*cmp)(const void *,const void *);
} AVLTree;
int getRank(const AVLNode *t){
return t==NULL?0:t->rank;
}
int getSize(const AVLNode *t){
return t==NULL?0:t->size;
}
int getBias(const AVLNode *t){
return t==NULL?0:t->bias;
}
AVLNode* newAVLNode(const void *v,const size_t size){
AVLNode *res=(AVLNode *)malloc(sizeof(AVLNode));
res->val=malloc(size);
memcpy(res->val,v,size);
res->size=1;
res->rank=1;
res->bias=0;
res->left=NULL;
res->right=NULL;
return res;
}
void freeAVLNode(AVLNode *t){
free(t->val);
free(t);
return;
}
AVLTree* newAVLTree(const size_t size,int (*cmp)(const void *,const void *)){
AVLTree *res=(AVLTree *)malloc(sizeof(AVLTree));
res->root=NULL;
res->valSize=size;
res->cmp=cmp;
return res;
}
AVLNode* update(AVLNode *t){
if(t==NULL) return NULL;
int lrank=getRank(t->left);
int rrank=getRank(t->right);
t->rank=1+(lrank>rrank?lrank:rrank);
t->size=1+getSize(t->left)+getSize(t->right);
t->bias=lrank-rrank;
return t;
}
AVLNode* leftRotate(AVLNode *v){
AVLNode *u=v->right;
v->right=u->left;
u->left=v;
update(v);
update(u);
return u;
}
AVLNode* rightRotate(AVLNode *u){
AVLNode *v=u->left;
u->left=v->right;
v->right=u;
update(u);
update(v);
return v;
}
AVLNode* balance(AVLNode *t){
if(t==NULL) return NULL;
int b=getBias(t);
if(b<=-2){
if(getBias(t->right)>0) t->right=rightRotate(t->right);
t=leftRotate(t);
} else if(b>=2){
if(getBias(t->left)<0) t->left=leftRotate(t->left);
t=rightRotate(t);
}
return t;
}
AVLNode* insert_func(AVLNode *r,const void *v,AVLTree *t){
if(r==NULL) return newAVLNode(v,t->valSize);
if(t->cmp(r->val,v)>=0){
r->left=insert_func(r->left,v,t);
} else {
r->right=insert_func(r->right,v,t);
}
update(r);
return balance(r);
}
void insert(AVLTree *t,const void *v){
t->root=insert_func(t->root,v,t);
return;
}
AVLNode* erase_func_max(AVLNode *r,AVLNode **max){
if(r->right==NULL){
*max=r;
return r->left;
}
r->right=erase_func_max(r->right,max);
update(r);
return balance(r);
}
AVLNode* erase_func(AVLNode *r,const void *v,AVLTree *t){
if(r==NULL) return NULL;
int c=t->cmp(r->val,v);
if(c==0){
AVLNode *f=r;
if(r->left==NULL){
r=r->right;
} else if(r->right==NULL){
r=r->left;
} else {
AVLNode *max;
r->left=erase_func_max(r->left,&max);
max->left=r->left;
max->right=r->right;
r=max;
}
freeAVLNode(f);
} else if(c>0){
r->left=erase_func(r->left,v,t);
} else {
r->right=erase_func(r->right,v,t);
}
update(r);
return balance(r);
}
void erase(AVLTree *t,const void *v){
t->root=erase_func(t->root,v,t);
}
void search(AVLTree *t,int k,void *res){
if(k<1 || getSize(t->root)<k) return;
AVLNode *r=t->root;
while(1){
if(getSize(r->left)<k){
k-=getSize(r->left);
if(k==1){
memcpy(res,r->val,t->valSize);
return;
}
k--;
r=r->right;
} else {
r=r->left;
}
}
}
typedef long long int int64;
int cmp(const void *a,const void *b){
int64 p=*(int64 *)a;
int64 q=*(int64 *)b;
return p==q?0:p-q<0?-1:1;
}
void run(void){
int q,k;
scanf("%d%d",&q,&k);
AVLTree *t=newAVLTree(sizeof(int64),cmp);
while(q--){
int c;
scanf("%d",&c);
if(c==1){
int64 v;
scanf("%lld",&v);
insert(t,&v);
} else if(getSize(t->root)<k){
printf("-1\n");
} else {
int64 v;
search(t,k,&v);
printf("%lld\n",v);
erase(t,&v);
}
}
}
int main(void){
run();
return 0;
}
akakimidori