Cod sursa(job #794835)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 7 octombrie 2012 10:38:19
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include<fstream>
using namespace std;
const int NMAX = 1001;

ifstream f("struti.in");
ofstream g("struti.out");

int p[NMAX][NMAX],minp[NMAX][NMAX],maxp[NMAX][NMAX],dequemin[NMAX],dequemax[NMAX];
char buff[NMAX*NMAX*7];
void citire(int i)
{
	int numar,m,poz,l;
	f.get(buff,NMAX*NMAX*7-1);
	f.get();
	m=strlen(buff)-1;
	l=0;
	for(poz=0;poz<=m;poz++) {
		while(buff[poz]<'0' || buff[poz]>'9')
			poz++;
		numar=0;
		while(buff[poz]>='0' && buff[poz]<='9' && poz<=m) {
			numar=numar*10+buff[poz]-48;
			poz++;
		}
		p[i][++l]=numar;
	}
}
void builtmin(int n, int m, int r, int c)
{
	int deque[NMAX],st,dr,i,j;
	for(j=1;j<=m;j++) {
		st=1;
		dr=0;
		for(i=1;i<=n;i++) {
			while(st<=dr && p[deque[dr]][j]>p[i][j])
				dr--;
			deque[++dr]=i;
			if(i-r>=deque[st])
				st++;
			if(i>=r)
				minp[i-r+1][j]=p[deque[st]][j];
		}
	}
}
void builtmax(int n, int m, int r, int c)
{
	int deque[NMAX],st,dr,i,j;
	for(j=1;j<=m;j++) {
		st=1;
		dr=0;
		for(i=1;i<=n;i++) {
			while(st<=dr && p[deque[dr]][j]<p[i][j])
				dr--;
			deque[++dr]=i;
			if(i-r>=deque[st])
				st++;
			if(i>=r)
				maxp[i-r+1][j]=p[deque[st]][j];
		}
	}
}
void solve(int n, int m, int r, int c, int &dmin, int &nr)
{
	int i,j,stmin,drmin,stmax,drmax,d;
	for(i=1;i<=n-r+1;i++) {
		stmin=stmax=1;
		drmin=drmax=0;
		for(j=1;j<=m;j++) {
			while(stmin<=drmin && minp[i][dequemin[drmin]]>minp[i][j])
				drmin--;
			dequemin[++drmin]=j;
			while(stmax<=drmax && maxp[i][dequemax[drmax]]<maxp[i][j])
				drmax--;
			dequemax[++drmax]=j;
			if(j-c>=dequemin[stmin])
				stmin++;
			if(j-c>=dequemax[stmax])
				stmax++;
			if(j>=c) {
				d=maxp[i][dequemax[stmax]]-minp[i][dequemin[stmin]];
				if(d<dmin) {
					dmin=d;
					nr=1;
				}
				else if(d==dmin)
					nr++;
			}
		}
	}
}
int main ()
{
	int n,m,r,c,i,dmin,nr,k;
	f>>n>>m>>k;
	f.get();
	for(i=1;i<=n;i++)
		citire(i);
	for(i=1;i<=k;i++) {
		f>>r>>c;
		dmin=(1<<30);
		nr=0;
		builtmin(n,m,r,c);
		builtmax(n,m,r,c);
		solve(n,m,r,c,dmin,nr);
		if(r!=c) {
			swap(r,c);
			builtmin(n,m,r,c);
			builtmax(n,m,r,c);
			solve(n,m,r,c,dmin,nr);
		}
		g<<dmin<<" "<<nr<<'\n';
	}
	f.close();
	g.close();
	return 0;
}