Cod sursa(job #213930)

Utilizator hadesgamesTache Alexandru hadesgames Data 12 octombrie 2008 01:07:02
Problema Struti Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 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");
string s;
istringstream in;
pair<int,int> minim;
int n,m,a[1005][1005],b[1005][1005],c[1005][1005];
void  comp(int x)
{	
	if (x<minim.fs)
		minim=mp(x,0);
	if (x==minim.fs)
		minim.ss++;
//	printf("comp=%d minim=%d %d\n",x,minim.fs);
}
void precalc_lini(int x)
{
	int i,j;
	deque <pair<int,int> > qmin,qmax;
	FOR(i,1,m)
	{
		qmin.resize(0);
		qmax.resize(0);
		FOR(j,1,x)
		{
			while ((!qmin.empty())&&qmin.back().fs>=a[i][j])
				qmin.popb();
			qmin.pb(mp(a[i][j],j));
			while ((!qmax.empty())&&qmax.back().fs<=a[i][j]&&!qmax.empty())
				qmax.popb();
			qmax.pb(mp(a[i][j],j));
		}
		b[i][1]=qmin.front().fs;
	//	printf("%d ",b[i][1]);
		c[i][1]=qmax.front().fs;
		
		FOR(j,x+1,n)
		{
			while ((!qmin.empty())&&j-qmin.front().ss>=x)
				qmin.popf();
			while ((!qmin.empty())&&qmin.back().fs>=a[i][j])
				qmin.popb();
			while ((!qmax.empty())&&j-qmax.front().ss>=x)
				qmax.popf();
			while ((!qmax.empty())&&qmax.back().fs<=a[i][j])
				qmax.popb();
			qmin.pb(mp(a[i][j],j));
			qmax.pb(mp(a[i][j],j));
			b[i][j-x+1]=qmin.front().fs;
			c[i][j-x+1]=qmax.front().fs;
	//		printf("%d ",b[i][j-x+1]);
		}
	//	printf("\n");

	}
}
void search(int x,int y)
{
	int i,j;
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	precalc_lini(x);
	deque<pair<int,int> > qmin,qmax;
	FOR(j,1,n-x+1)
	{
		qmin.resize(0);
		qmin.resize(0);
		FOR(i,1,y)
		{
			while ((!qmin.empty())&&qmin.back().fs>=b[i][j])
				qmin.popb();
			qmin.pb(mp(b[i][j],i));
			while ((!qmax.empty())&&qmax.back().fs<=c[i][j])
				qmax.popb();
			qmax.pb(mp(c[i][j],i));			
		}
		comp(qmax.front().fs-qmin.front().fs);
		FOR(i,y+1,m)
		{
			while ((!qmin.empty())&&i-qmin.front().ss>=y)
				qmin.popf();
			while ((!qmin.empty())&&qmin.back().fs>=b[i][j])
				qmin.popb();
			while ((!qmax.empty())&&i-qmax.front().ss>=y)
				qmax.popf();
			while ((!qmax.empty())&&qmax.back().fs<=c[i][j])
				qmax.popb();
			qmin.pb(mp(b[i][j],i));
			qmax.pb(mp(c[i][j],i));
			comp(qmax.front().fs-qmin.front().fs);
		}


	}

}
int main()
{
	FILE *out;
	int i,j,p,x,y;
	out=fopen("struti.out","w");
	getline(fin,s,'\0');
	in.str(s);
	in>>n>>m>>p;
	FOR(i,1,m)
		FOR(j,1,n)
			in>>a[i][j];
	FOR(i,1,p)
	{
		in>>x>>y;
		minim=mp(1<<30,0);
		search(x,y);
		if (x!=y)
			search(y,x);
		fprintf(out,"%d %d\n",minim.fs,minim.ss);
	}
	fclose(out);
	return 0;
}