結果
| 問題 | No.649 ここでちょっとQK! |
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2018-10-07 22:41:22 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 556 ms / 3,000 ms |
| コード長 | 3,958 bytes |
| 記録 | |
| コンパイル時間 | 338 ms |
| コンパイル使用メモリ | 33,508 KB |
| 実行使用メモリ | 17,592 KB |
| 最終ジャッジ日時 | 2024-10-12 14:20:23 |
| 合計ジャッジ時間 | 5,757 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
ソースコード
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct scapegoatTreeNode{
void *val;
int size;
struct scapegoatTreeNode *left;
struct scapegoatTreeNode *right;
} sNode;
typedef struct scapegoatTreeHead{
sNode *root;
int del;
size_t size;
int (*cmp)(const void *,const void *);
} sTree;
sTree* newSTree(size_t size,int (*cmp)(const void *,const void *)){
sTree *res=(sTree *)malloc(sizeof(sTree));
res->root=NULL;
res->del=0;
res->size=size;
res->cmp=cmp;
return res;
}
sNode* newNode(const void *v,size_t size){
sNode *res=(sNode *)malloc(sizeof(sNode));
res->val=malloc(size);
memcpy(res->val,v,size);
res->size=1;
res->left=NULL;
res->right=NULL;
return res;
}
void freeNode(sNode *t){
free(t->val);
free(t);
return;
}
void freeAllNode(sNode *r){
if(r==NULL) return;
freeAllNode(r->left);
freeAllNode(r->right);
freeNode(r);
return;
}
int getSize(sNode *r){
return r==NULL?0:r->size;
}
void update(sNode *r){
if(r==NULL) return;
r->size=1+getSize(r->left)+getSize(r->right);
return;
}
int packToArray(sNode *r,void *array,size_t size){
if(r==NULL) return 0;
int cnt=packToArray(r->left,array,size);
memcpy(array+size*cnt++,r->val,size);
return cnt+packToArray(r->right,array+size*cnt,size);
}
sNode* buildBalanced(void *array,int n,size_t size){
if(n<=0) return NULL;
int m=n/2;
sNode *res=newNode(array+size*m,size);
res->left=buildBalanced(array,m,size);
res->right=buildBalanced(array+size*(m+1),n-1-m,size);
update(res);
return res;
}
sNode* rebuild(sNode *r,size_t size){
void *array=malloc(size*getSize(r));
int n=packToArray(r,array,size);
freeAllNode(r);
sNode *res=buildBalanced(array,n,size);
free(array);
return res;
}
sNode* insert_func(sNode *r,const void *v,sTree *t,int cond){
if(r==NULL) return newNode(v,t->size);
int flag=0;
if(t->cmp(r->val,v)>=0){
flag=getSize(r->left)*3>getSize(r)*2+1;
r->left=insert_func(r->left,v,t,flag||cond);
} else {
flag=getSize(r->right)*3>getSize(r)*2+1;
r->right=insert_func(r->right,v,t,flag||cond);
}
update(r);
if(!cond && flag) r=rebuild(r,t->size);
return r;
}
void insert(sTree *t,const void *v){
t->root=insert_func(t->root,v,t,0);
}
sNode* erase_func_findMax(sNode *r,sNode **max){
if(r->right==NULL){
*max=r;
return r->left;
}
r->right=erase_func_findMax(r->right,max);
update(r);
return r;
}
sNode* erase_func(sNode *r,const void *v,sTree *t){
if(r==NULL) return NULL;
int c=t->cmp(r->val,v);
if(c==0){
sNode *f=r;
if(r->left==NULL){
r=r->right;
} else if(r->right==NULL){
r=r->left;
} else {
sNode *max;
r->left=erase_func_findMax(r->left,&max);
max->left=r->left;
max->right=r->right;
r=max;
}
freeNode(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 r;
}
void erase(sTree *t,const void *v){
t->root=erase_func(t->root,v,t);
t->del++;
if(t->del*2>getSize(t->root)){
t->root=rebuild(t->root,t->size);
t->del=0;
}
}
void search(sTree *t,int k,void *v){
sNode *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);
sTree *t=newSTree(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