Четвёртый открытый Зеленоградский турнир 2008

#include <stdio.h>
#include <string.h>
#include <algorithm>
 
using namespace std;
#define nul(a) memset(a,0,sizeof(a))
 
int cnts[50];
char use[100][100];
int a[100][100];
struct pos
{
	int i,v;
	void init(int _i,int _v)
	{
		i=_i;
		v=_v;
	}
	bool operator<(pos p) const
	{
		return v<p.v;
	}
} p[50];
int _p[50],n,m;
char mn[100];
int s[10000][2];
int down[100];
void init(int u,int i,int j)
{
	s[u][0]=i;
	s[u][1]=j;
}
int fil(int i,int j)
{
	int u=1,c=a[i][j],d;
	init(0,i,j);
	use[i][j]=1;
	for (d=0;d<u;d++)
	{
		i=s[d][0];
		j=s[d][1];
		if (i&&!use[i-1][j]&&a[i-1][j]==c)
		{
			init(u++,i-1,j);
			use[i-1][j]=1;
		}
		if (i+1<n&&!use[i+1][j]&&a[i+1][j]==c)
		{
			init(u++,i+1,j);
			use[i+1][j]=1;
		}
		if (j&&!use[i][j-1]&&a[i][j-1]==c)
		{
			init(u++,i,j-1);
			use[i][j-1]=1;
		}
		if (j+1<m&&!use[i][j+1]&&a[i][j+1]==c)
		{
			init(u++,i,j+1);
			use[i][j+1]=1;
		}
	}
	return u;
}
void del(int i,int j)
{
	int u=1,c=a[i][j],d,z;
	init(0,i,j);
	a[i][j]=-1;
	nul(mn);
	for (d=0;d<u;d++)
	{
		i=s[d][0];
		j=s[d][1];
		if (mn[j]<i)
			mn[j]=i;
		if (i&&a[i-1][j]==c)
		{
			init(u++,i-1,j);
			a[i-1][j]=-1;
		}
		if (i+1<n&&a[i+1][j]==c)
		{
			init(u++,i+1,j);
			a[i+1][j]=-1;
		}
		if (j&&a[i][j-1]==c)
		{
			init(u++,i,j-1);
			a[i][j-1]=-1;
		}
		if (j+1<m&&a[i][j+1]==c)
		{
			init(u++,i,j+1);
			a[i][j+1]=-1;
		}
	}
	for (j=0;j<m;j++)
	{
		for (z=i=mn[j];i>=down[j];i--)
		if (a[i][j]+1)
			a[z--][j]=a[i][j];
		for (;z>=down[j];z--)
			a[z][j]=-1;
 
	}
	for (d=0;d<u;d++)
		down[s[d][1]]++;
}
int main()
{
#ifdef pperm
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
#endif
	int ti,tests,c,i,j,k,mn,mi,mj,cur;
	scanf("%d",&tests);
	for (ti=0;ti<tests;ti++)
	{
		nul(down);
		nul(cnts);
		printf("Y\n");
		scanf("%d%d%d",&n,&m,&c);
		for (i=0;i<n;i++)
		for (j=0;j<m;j++)
		{
			scanf("%d",&a[i][j]);
			cnts[a[i][j]]++;
		}
		for (i=0;i<c;i++)
			p[i].init(i,cnts[i]);
		/*for (i=0;i<c-1;i++)
		for (j=0;j<c-i-1;j++)
		if (cnts[p[j]]>cnts[p[j+1]])
		{
			p[j]^=p[j+1];
			p[j+1]^=p[j];
			p[j]^=p[j+1];
		}*/
		sort(p,p+c);
		for (i=0;i<c;i++)
			_p[p[i].i]=i;
		for (i=0;i<n;i++)
		for (j=0;j<m;j++)
			a[i][j]=_p[a[i][j]];
		if (c==4)
		{
			nul(use);
			mn=1;
			for (k=0;k<c-4;)
			{
up4:			mn=0;
				for (j=0;j<m;j++)
				for (i=down[j];i<n;i++)
				if (a[i][j]+1&&a[i][j]<=k)
				{
					if (fil(i,j)>1)
					{
						del(i,j);
						printf("%d %d\n",i,j);
						nul(use);
						mn=1;
					}
				}
				if (!mn)
					k++;
			}
			k=c-5;
			mn=12345;
			for (j=0;j<m;j++)
			for (i=down[j];i<n;i++)
			if (!use[i][j]&&a[i][j]==c-4)
			{
				cur=fil(i,j);
				if (cur>1&&cur<mn)
				{
					mi=i;
					mj=j;
					mn=cur;
				}
			}
			if (mn!=12345)
			{
					del(mi,mj);
					printf("%d %d\n",mi,mj);
					nul(use);
					goto up4;
			}
			for (j=0;j<m;j++)
			for (i=down[j];i<n;i++)
			if (!use[i][j]&&a[i][j]==c-3)
			{
				cur=fil(i,j);
				if (cur>1&&cur<mn)
				{
					mi=i;
					mj=j;
					mn=cur;
				}
			}
			if (mn!=12345)
			{
					del(mi,mj);
					printf("%d %d\n",mi,mj);
					nul(use);
					goto up4;
			}
			for (j=0;j<m;j++)
			for (i=down[j];i<n;i++)
			if (!use[i][j]&&a[i][j]==c-2)
			{
				cur=fil(i,j);
				if (cur>1&&cur<mn)
				{
					mi=i;
					mj=j;
					mn=cur;
				}
			}
			if (mn!=12345)
			{
					del(mi,mj);
					printf("%d %d\n",mi,mj);
					nul(use);
					goto up4;
			}
			for (j=0;j<m;j++)
			for (i=down[j];i<n;i++)
			if (!use[i][j]&&a[i][j]==c-1)
			{
				cur=fil(i,j);
				if (cur>1&&cur<mn)
				{
					mi=i;
					mj=j;
					mn=cur;
				}
			}
			if (mn!=12345)
			{
					del(mi,mj);
					printf("%d %d\n",mi,mj);
					nul(use);
					goto up4;
			}
			printf("-1 -1\n");
		}
		else
		if (c<=5||(p[c-1].v+p[c-2].v+p[c-3].v)*5>=n*m*2)
		{
			nul(use);
			mn=1;
			for (k=0;k<c-3;)
			{
up3:			mn=0;
				for (j=0;j<m;j++)
				for (i=down[j];i<n;i++)
				if (a[i][j]+1&&a[i][j]<=k)
				{
					if (fil(i,j)>1)
					{
						del(i,j);
						printf("%d %d\n",i,j);
						nul(use);
						mn=1;
					}
				}
				if (!mn)
					k++;
			}
			k=c-4;
			mn=12345;
			for (j=0;j<m;j++)
			for (i=down[j];i<n;i++)
			if (!use[i][j]&&a[i][j]==c-3)
			{
				cur=fil(i,j);
				if (cur>1&&cur<mn)
				{
					mi=i;
					mj=j;
					mn=cur;
				}
			}
			if (mn!=12345)
			{
					del(mi,mj);
					printf("%d %d\n",mi,mj);
					nul(use);
					goto up3;
			}
			for (j=0;j<m;j++)
			for (i=down[j];i<n;i++)
			if (!use[i][j]&&a[i][j]==c-2)
			{
				cur=fil(i,j);
				if (cur>1&&cur<mn)
				{
					mi=i;
					mj=j;
					mn=cur;
				}
			}
			if (mn!=12345)
			{
					del(mi,mj);
					printf("%d %d\n",mi,mj);
					nul(use);
					goto up3;
			}
			for (j=0;j<m;j++)
			for (i=down[j];i<n;i++)
			if (!use[i][j]&&a[i][j]==c-1)
			{
				cur=fil(i,j);
				if (cur>1&&cur<mn)
				{
					mi=i;
					mj=j;
					mn=cur;
				}
			}
			if (mn!=12345)
			{
					del(mi,mj);
					printf("%d %d\n",mi,mj);
					nul(use);
					goto up3;
			}
			printf("-1 -1\n");
		}
		else
		if ((p[c-1].v+p[c-2].v)*7>=n*m*2)
		{
			nul(use);
			mn=1;
			for (k=0;k<c-2;)
			{
up2:			mn=0;
				for (j=0;j<m;j++)
				for (i=down[j];i<n;i++)
				if (a[i][j]+1&&a[i][j]<=k)
				{
					if (fil(i,j)>1)
					{
						del(i,j);
						printf("%d %d\n",i,j);
						nul(use);
						mn=1;
					}
				}
				if (!mn)
					k++;
			}
			k=c-3;
			mn=12345;
			for (j=0;j<m;j++)
			for (i=down[j];i<n;i++)
			if (!use[i][j]&&a[i][j]==c-2)
			{
				cur=fil(i,j);
				if (cur>1&&cur<mn)
				{
					mi=i;
					mj=j;
					mn=cur;
				}
			}
			if (mn==12345)
				mn=0;
			if (mn)
			{
					del(mi,mj);
					printf("%d %d\n",mi,mj);
					nul(use);
					goto up2;
			}
			mn=12345;
			for (j=0;j<m;j++)
			for (i=down[j];i<n;i++)
			if (!use[i][j]&&a[i][j]==c-1)
			{
				cur=fil(i,j);
				if (cur>1&&cur<mn)
				{
					mi=i;
					mj=j;
					mn=cur;
				}
			}
			if (mn==12345)
				mn=0;
			if (mn)
			{
					del(mi,mj);
					printf("%d %d\n",mi,mj);
					nul(use);
					goto up2;
			}
			printf("-1 -1\n");
		}
		else
		{
			nul(use);
			for (k=0;k<c-1;)
			{
up:				mn=0;
				for (j=0;j<m;j++)
				for (i=down[j];i<n;i++)
				if (a[i][j]+1&&a[i][j]<=k)
				{
					if (fil(i,j)>1)
					{
						del(i,j);
						printf("%d %d\n",i,j);
						nul(use);
						mn=1;
					}
				}
				if (!mn)
					k++;
			}
			mn=12345;
			for (j=0;j<m;j++)
			for (i=down[j];i<n;i++)
			if (!use[i][j]&&a[i][j]==c-1)
			{
				cur=fil(i,j);
				if (cur>1&&cur<mn)
				{
					mi=i;
					mj=j;
					mn=cur;
				}
			}
			if (mn!=12345)
			{
					del(mi,mj);
					printf("%d %d\n",mi,mj);
					nul(use);
					k=c-2;
					goto up;
			}
			printf("-1 -1\n");
		}
	}
	return 0;
}