Cod sursa(job #213473)

Utilizator hadesgamesTache Alexandru hadesgames Data 9 octombrie 2008 22:01:53
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.77 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
short int a[10][1005][1005],b[10][1005][1005];
int put[20],log[1005],n,m;
int recmin(int k,int i,int j)
{
	return min(a[k-1][i][j],a[k-1][i][j+put[k-1]]);
}
int recmax(int k,int i,int j)
{
	return max(a[k-1][i][j],a[k-1][i][j+put[k-1]]);
}
int rmqmax(int i,int j,int x)
{
//	printf("b[%d][%d-%d]=%d\n",i,j,x,max(b[log[x]][i][j],b[log[x]][i][j+x-put[log[x]]]));
	return max(b[log[x]][i][j],b[log[x]][i][j+x-put[log[x]]]);
}
int rmqmin(int i,int j,int x)
{
//	printf("a[%d][%d-%d]=%d\n",i,j,x,min(a[log[x]][i][j],a[log[x]][i][j+x-put[log[x]]]));
	return min(a[log[x]][i][j],a[log[x]][i][j+x-put[log[x]]]);
}
pair<int,int> search(int x,int y)
{
	pair<int,int>minim =mp(1<<30,0);
	int i,j,k,maxv,minv;
	FOR(i,1,m)
		FOR(j,1,n)
			for(int t=0;t<=1;t++,swap(x,y))
				if(x+i-1<=m&&y+j-1<=n)
				{
					maxv=-1;
					minv=1<<30;
					FOR(k,i,i+x-1)
					{
						maxv=max(maxv,rmqmax(k,j,y));
						minv=min(minv,rmqmin(k,j,y));
					}
					if (maxv-minv<minim.fs)
					{
						minim=mp(maxv-minv,0);
	//					printf("%d %d %d (%d %d)\n",minim.fs,i,j,x,y);
					}
					if (maxv-minv==minim.fs)
					{
						minim.ss++;
	//					 printf("%d %d %d (%d %d)\n",minim.fs,i,j,x,y);
					}
				}
	if (x==y)
		minim.ss/=2;
	return minim;
}
ifstream fin("struti.in");
string s;
istringstream in;
int main()
{
	FILE *out;
	int i,j,x,y,k,p;
	out=fopen("struti.out","w");
	getline(fin,s,'\0');
	in.str(s);
	in>>m>>n>>p;
//	in>>m>>n>>p;
	//printf("%d %d %d",n,m,p);
	FOR(i,1,m)
	{
		FOR(j,1,n)
		{
			in>>a[0][i][j];
			//printf("%d ",a[0][i][j]);
			b[0][i][j]=a[0][i][j];
		}
	//	printf("\n");
	}
	x=1;
	y=0;
	FOR(i,1,1004) //calc log si put
	{
		if (x==i)
		{
			x*=2;
			y++;
		}
		log[i]=y-1;
	//	if (n!=4)
	//	{
	//		printf("WTFF!!!!!???:%d\n",i);
	//		return 0;
	//	}
	}
//	printf("---------------------\n");
//	if (n!=4)
//		printf("WWWWWWWWWWWWWWWW");
//	else
//		printf("%d\n",n);
/*//	FOR(i,1,1000)
		printf("%d ",log[i]);*/
	put[0]=1;
	for(i=1;i<=10;i++)
		put[i]=put[i-1]*2;
	//printf("%d\n",n-put[log[n]]+1);
	FOR(i,1,m)
	{
		FOR(k,1,log[n])
			FOR(j,1,n-put[k]+1)
			{
		//		printf("a[%d][%d][%d]=%d\n",k,i,j,
				a[k][i][j]=recmin(k,i,j);
				b[k][i][j]=recmax(k,i,j);
			}	
	}
	int z;
	FOR(i,1,p)
	{
		in>>x>>z;
		pair<int,int> r=search(x,z);
		fprintf(out,"%d %d\n",r.fs,r.ss);
	}
	fclose(out);
	return 0;
}