結果
| 問題 | No.649 ここでちょっとQK! |
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2018-09-09 11:27:52 |
| 言語 | C90 (gcc 12.3.0) |
| 結果 |
AC
|
| 実行時間 | 127 ms / 3,000 ms |
| コード長 | 1,649 bytes |
| 記録 | |
| コンパイル時間 | 1,006 ms |
| コンパイル使用メモリ | 23,168 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-12-23 02:46:05 |
| 合計ジャッジ時間 | 5,850 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
コンパイルメッセージ
main.c: In function ‘run’:
main.c:74:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
74 | scanf("%d%d",&q,&k);
| ^~~~~~~~~~~~~~~~~~~
main.c:79:5: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
79 | scanf("%d",&c);
| ^~~~~~~~~~~~~~
main.c:81:7: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
81 | scanf("%lld",v+i);
| ^~~~~~~~~~~~~~~~~
ソースコード
#include<stdio.h>
#include<stdlib.h>
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;
}
int64 *za=NULL;
int len=0;
void compress(int64 *v,int q){
za=(int64 *)malloc(sizeof(int64)*q);
int i;
for(i=0;i<q;i++) za[i]=v[i];
qsort(za,q,sizeof(int64),cmp);
len=0;
i=0;
while(i<q){
za[len]=za[i];
while(i<q && za[len]==za[i]) i++;
len++;
}
return;
}
int toIndex(int64 v){
int l=0;
int r=len;
while(r-l>1){
int m=(r+l)/2;
if(za[m]<=v){
l=m;
} else {
r=m;
}
}
return l;
}
void add(int *bit,int index,int a){
int n=bit[0];
int i;
for(i=index;i<=n;i+=i&-i) bit[i]+=a;
return;
}
int sum(int *bit,int index){
int res=0;
int i;
for(i=index;i>0;i-=i&-i) res+=bit[i];
return res;
}
int lowerBound(int *bit,int w){
int n=bit[0];
int x=0;
int k=1;
while(2*k<=n) k*=2;
while(k>0){
if(x+k<=n && bit[x+k]<w){
w-=bit[x+k];
x+=k;
}
k/=2;
}
return x+1;
}
void run(void){
int q,k;
scanf("%d%d",&q,&k);
int64 *v=(int64 *)malloc(sizeof(int64)*q);
int i;
for(i=0;i<q;i++){
int c;
scanf("%d",&c);
if(c==1){
scanf("%lld",v+i);
} else {
v[i]=-1;
}
}
compress(v,q);
int *bit=(int *)calloc(len+1,sizeof(int));
bit[0]=len;
for(i=0;i<q;i++){
if(v[i]>=0){
add(bit,toIndex(v[i]),1);
} else if(sum(bit,len)<k){
printf("-1\n");
} else {
int index=lowerBound(bit,k);
printf("%lld\n",za[index]);
add(bit,index,-1);
}
}
return;
}
int main(void){
run();
return 0;
}
akakimidori