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;
}
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;
}