Cod sursa(job #794932)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 7 octombrie 2012 13:15:07
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include<fstream>
#include<ctype.h>
using namespace std;

const int NMAX = 1001;

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

int n,m,intr;
short int p[NMAX][NMAX],minp[NMAX][NMAX],maxp[NMAX][NMAX],q[2][11],dequemin[NMAX],dequemax[NMAX],deque[NMAX];
char s[NMAX*NMAX*7];

inline void citire(int &n, int &m)
{
	int nr,j,i;
	j=0;
	f>>n>>m>>intr;
	f.getline(s,7*NMAX*NMAX,EOF);
	for(i=1,nr=0;i<=n;i++,nr=0)
		for( ;nr<m;j++)
			if(isdigit(s[j])) 
				for(nr=nr+1;isdigit(s[j]);p[i][nr]=p[i][nr]*10+s[j++]-48);
	for(i=1;i<=intr;i++) {
		for( ;isdigit(s[j])==0;j++);
		for( ;isdigit(s[j]);q[0][i]=q[0][i]*10+s[j++]-48);
		for( ;isdigit(s[j])==0;j++);
		for( ;isdigit(s[j]);q[1][i]=q[1][i]*10+s[j++]-48);
	}
	f.close();
}
inline void builtmin(int r, int c)
{
	int 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];
		}
	}
}
inline void builtmax(int r, int c)
{
	int 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];
		}
	}
}
inline void solve(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;
	citire(n,m);
	for(i=1;i<=intr;i++) {
		r=q[0][i];
		c=q[1][i];
		dmin=(1<<30);
		nr=0;
		builtmin(r,c);
		builtmax(r,c);
		solve(r,c,dmin,nr);
		if(r!=c) {
			swap(r,c);
			builtmin(r,c);
			builtmax(r,c);
			solve(r,c,dmin,nr);
		}
		g<<dmin<<" "<<nr<<'\n';
	}
	g.close();
	return 0;
}