Codeforces Round #388 (Div. 2), problem: (D) Leaving Auction Solution in C/C++

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

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *