Codeforces Round #388 (Div. 2), problem: (D) Leaving Auction Solution in C/C++
#include<stdio.h> #include<stdlib.h> typedef unsigned u; u *G[222222],Ga[222222],Gi[222222],M[222222],P[222222],S[222222],V[222222]; int F(const void*x,const void*y) { if(M[*(u*)x]>M[*(u*)y])return 1; if(M[*(u*)x]<M[*(u*)y])return-1; if(*(u*)x<*(u*)y)return 1; if(*(u*)x>*(u*)y)return-1; return 0; } int main() { u n,i=-1,j,k,q=0,Q,lo,hi,mi; for(scanf("%u",&n);++i<n;S[i]=i) { scanf("%u%u",&j,&k);liar:; if(Ga[j]==Gi[j]) { if(!Ga[j])G[j]=(u*)calloc(Ga[j]=1,sizeof(u)); else G[j]=(u*)realloc(G[j],(Ga[j]<<=1)*sizeof(u)); } G[j][Gi[j]++]=M[j]=k;P[j]=1; } if(i==n){j=k=0;goto liar;} qsort(S,i,sizeof(u),F); for(scanf("%u",&Q);q++<Q;) { for(scanf("%u",&k);k--;V[j]=q)scanf("%u",&j); for(k=i;k;)if(V[S[--k]]!=q&&P[S[k]])break; if(!k){printf("0 0\n");continue;} if(M[S[k]]<1){printf("%u 0\n",S[k]);continue;} for(j=k;j;)if(V[S[--j]]!=q&&P[S[j]])break; j=M[S[j]];k=S[k];lo=0;hi=Gi[k]-1; while((mi=(lo+hi)>>1)>lo) { if(G[k][mi]>=j)hi=mi; else lo=mi; } if(G[k][lo]>=j)hi=lo; printf("%u %u\n",k,G[k][hi]); } return 0; }