結果
| 問題 | No.649 ここでちょっとQK! |
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2018-10-08 17:58:49 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 305 ms / 3,000 ms |
| コード長 | 3,869 bytes |
| 記録 | |
| コンパイル時間 | 254 ms |
| コンパイル使用メモリ | 33,664 KB |
| 実行使用メモリ | 18,004 KB |
| 最終ジャッジ日時 | 2024-10-12 15:13:25 |
| 合計ジャッジ時間 | 5,794 ms |
|
ジャッジサーバーID (参考情報) |
judge / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
ソースコード
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//Exercise8..10 : http://opendatastructures.org/ods-python/8_2_Discussion_Exercises.html
typedef struct DynamiteTreeNode{
void *val;
int size;
struct DynamiteTreeNode *left;
struct DynamiteTreeNode *right;
} DNode;
typedef struct DynamiteTreeHead{
DNode *root;
size_t size;
int (*cmp)(const void *,const void *);
} DTree;
DTree* newDTree(size_t size,int (*cmp)(const void *,const void *)){
DTree *res=(DTree *)malloc(sizeof(DTree));
res->root=NULL;
res->size=size;
res->cmp=cmp;
return res;
}
DNode* newNode(const void *v,size_t size){
DNode *res=(DNode *)malloc(sizeof(DNode));
res->val=malloc(size);
memcpy(res->val,v,size);
res->size=1;
res->left=NULL;
res->right=NULL;
return res;
}
void freeNode(DNode *t){
free(t->val);
free(t);
return;
}
int getSize(DNode *r){
return r==NULL?0:r->size;
}
int explode(DNode *r){
if(r==NULL) return 0;
return 1.0/getSize(r)>((double)rand()+1.0)/((double)RAND_MAX+2.0);
}
void update(DNode *r){
if(r==NULL) return;
r->size=1+getSize(r->left)+getSize(r->right);
return;
}
int packToArray(DNode *r,DNode **array){
if(r==NULL) return 0;
int cnt=packToArray(r->left,array);
array[cnt++]=r;
return cnt+packToArray(r->right,array+cnt);
}
DNode* buildBalanced(DNode **array,int n){
if(n<=0) return NULL;
int m=n/2;
DNode *res=array[m];
res->left=buildBalanced(array,m);
res->right=buildBalanced(array+m+1,n-1-m);
update(res);
return res;
}
DNode* rebuild(DNode *r){
DNode **array=(DNode **)malloc(sizeof(DNode *)*getSize(r));
int n=packToArray(r,array);
DNode *res=buildBalanced(array,n);
free(array);
return res;
}
DNode* insert_func(DNode *r,const void *v,DTree *t,int burst){
if(r==NULL) return newNode(v,t->size);
int f=explode(r);
if(t->cmp(r->val,v)>=0){
r->left=insert_func(r->left,v,t,burst||f);
} else {
r->right=insert_func(r->right,v,t,burst||f);
}
update(r);
if(!burst && f) r=rebuild(r);
return r;
}
void insert(DTree *t,const void *v){
t->root=insert_func(t->root,v,t,0);
}
DNode* erase_func_findMax(DNode *r,DNode **max,int burst){
if(r->right==NULL){
*max=r;
return r->left;
}
int f=explode(r);
r->right=erase_func_findMax(r->right,max,burst|f);
update(r);
if(!burst && f) r=rebuild(r);
return r;
}
DNode* erase_func(DNode *r,const void *v,DTree *t,int burst){
if(r==NULL) return NULL;
int ex=explode(r);
int c=t->cmp(r->val,v);
if(c==0){
DNode *f=r;
if(r->left==NULL){
r=r->right;
} else if(r->right==NULL){
r=r->left;
} else {
DNode *max;
r->left=erase_func_findMax(r->left,&max,ex|burst);
max->left=r->left;
max->right=r->right;
r=max;
}
freeNode(f);
} else if(c>0){
r->left=erase_func(r->left,v,t,ex|burst);
} else {
r->right=erase_func(r->right,v,t,ex|burst);
}
update(r);
if(!burst && ex) r=rebuild(r);
return r;
}
void erase(DTree *t,const void *v){
t->root=erase_func(t->root,v,t,0);
}
void search(DTree *t,int k,void *v){
DNode *r=t->root;
while(1){
if(getSize(r->left)<k){
k-=getSize(r->left);
if(k==1){
memcpy(v,r->val,t->size);
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?-1:1;
}
void run(void){
int q,k;
scanf("%d%d",&q,&k);
DTree *t=newDTree(sizeof(int64),cmp);
for(int i=0;i<q;i++){
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