Cod sursa(job #212674)

Utilizator hadesgamesTache Alexandru hadesgames Data 6 octombrie 2008 12:44:37
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.44 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
#define FOR(i,a,b) for (i=a;i<=b;i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
ifstream fin("struti.in");
istringstream in;
string s;
int a[10][10][1002][1002],b[10][10][1002][1002];
int log[1010],put[20],n,m;
int min(int x,int y,int z,int t)
{
	return min(x,min(y,min(z,t)));
}
int max(int x,int y,int z,int t)
{
	return max(x,max(y,max(z,t)));
}
int recmin(int k,int t,int i, int j)
{
	if (k==0&&t==0)
		return a[k][t][i][j];
	if (k==0)
		return min(a[k][t-1][i][j],a[k][t-1][i][j+put[t-1]]);
	if (t==0)
		return min(a[k-1][t][i][j],a[k-1][t][i+put[k-1]][j]);
	return min(a[k-1][t-1][i][j],a[k-1][t-1][i+put[k-1]][j],a[k-1][t-1][i][j+put[t-1]],a[k-1][t-1][i+put[k-1]][j+put[t-1]]);
}
int recmax(int k,int t,int i, int j)
{
	if (k==0&&t==0)
		return b[k][t][i][j];
	if (k==0)
		return max(b[k][t-1][i][j],b[k][t-1][i][j+put[t-1]]);
	if (t==0)
		return max(b[k-1][t][i][j],b[k-1][t][i+put[k-1]][j]);
	return max(b[k-1][t-1][i][j],b[k-1][t-1][i+put[k-1]][j],b[k-1][t-1][i][j+put[t-1]],b[k-1][t-1][i+put[k-1]][j+put[t-1]]);
}
pair<int,int> search(int x,int y)
{
	int i,j;
	pair<int,int> minim=mp(1<<30,0);
	FOR(i,1,m)
		FOR(j,1,n)
		{
			if(i-1+x<=m&&j-1+y<=n)
			{
				int val=max(b[log[x]][log[y]][i][j],b[log[x]][log[y]][i+x-put[log[x]]][j],b[log[x]][log[y]][i][j+y-put[log[y]]],b[log[x]][log[y]][i+x-put[log[x]]][j+y-put[log[y]]])-min(a[log[x]][log[y]][i][j],a[log[x]][log[y]][i+x-put[log[x]]][j],a[log[x]][log[y]][i][j+y-put[log[y]]],a[log[x]][log[y]][i+x-put[log[x]]][j+y-put[log[y]]]);
//				printf("%d %d %d %d %d\n",i,j,x,y,val);
				if (val<minim.fs)
				{
					//printf("%d %d %d %d %d\n",i,j,x,y,val);
					minim=mp(val,0);
				}
				if (val==minim.fs)
					minim.ss++;
			}
			if (x!=y)
			{
				swap(x,y);
				if(i+x-1<=m&&j+y-1<=n)
				{
					int val=max(b[log[x]][log[y]][i][j],b[log[x]][log[y]][i+x-put[log[x]]][j],b[log[x]][log[y]][i][j+y-put[log[y]]],b[log[x]][log[y]][i+x-put[log[x]]][j+y-put[log[y]]])-min(a[log[x]][log[y]][i][j],a[log[x]][log[y]][i+x-put[log[x]]][j],a[log[x]][log[y]][i][j+y-put[log[y]]],a[log[x]][log[y]][i+x-put[log[x]]][j+y-put[log[y]]]);
//					printf("%d %d %d %d %d\n",i,j,x,y,val);
					if (val<minim.fs)
					{
						minim=mp(val,0);
					//	printf("%d %d %d %d %d\n",i,j,x,y,val);
					}
					if (val==minim.fs)
						minim.ss++;
				}
				swap(x,y);
			}
		}
//	printf("%d %d\n",x,y);
	return minim;
}
int main()
{
	int p,i,j,k,t,x,y;
	FILE *out;
	out=fopen("struti.out","w");
	getline(fin,s,'\0');
	in.str(s);
	in>>m>>n>>p;
	FOR(i,1,m)
		FOR(j,1,n)
		{
			in>>a[0][0][i][j];
			b[0][0][i][j]=a[0][0][i][j];
		}
	x=1;
	y=0;
	FOR(i,1,1005) //calc log si put
	{
		if (x==i)
		{
			x*=2;
			y++;
		}
		log[i]=y-1;
	}
	put[0]=1;
	for(i=1;i<=10;i++)
		put[i]=put[i-1]*2;
	FOR(k,1,log[m])
		FOR(t,1,log[n])
			FOR(i,1,m-put[k]+1)
				FOR(j,1,n-put[t]+1)
				{
					a[k][t][i][j]=recmin(k,t,i,j);
					b[k][t][i][j]=recmax(k,t,i,j);
				}
//	printf("a[%d][%d][%d][%d]=%d\n",1,1,1,1,b[1][1][1][1]);
	FOR(i,1,p)
	{
		in>>x>>y;
		pair<int,int> r1;
		r1=search(x,y);
		fprintf(out,"%d %d\n",r1.fs,r1.ss);

	}
	fclose(out);
	return 0;
}