Pagini recente » Cod sursa (job #69263) | Cod sursa (job #3212834) | Cod sursa (job #1689536) | Cod sursa (job #2776966) | Cod sursa (job #1073842)
#include<iostream>
#include<cstdio>
using namespace std;
int str[1002][1002], b[1002][1002], dqmin[1000002], dqmax[1000002], c[1002][1002], maxim[1002][1002], minim[1002][1002];
int main()
{
FILE *fin, *fout;
fin=fopen("struti.in","r");
fout=fopen("struti.out","w");
int i, j, nrlinii, nrcoloane, nrquery, k, l, MIN=10000, t, lg, x, y, primmin, primmax, ultimmin, ultimmax, nr, aux,lungime, latime ;
fscanf(fin, "%d %d %d", &nrlinii, &nrcoloane, &nrquery);
for(i=0; i<nrlinii; i++)
for(j=0; j<nrcoloane; j++)
{fscanf(fin, "%d", &str[i][j]);
b[i][j]=0;
}
for(aux=0; aux<nrquery; aux++)
{
//d[i][j]- pt latime fixata minimul de pe randl i care incepe cu j;
MIN=10000;
fscanf(fin, "%d %d", &lungime, &latime);
for(i=0; i<nrlinii; i++)
{
primmin=1;
ultimmin=0;
primmax=1;
ultimmax=0;
ultimmax++;
ultimmin++;
dqmin[ultimmin]=0;
dqmax[ultimmax]=0;
if(0>=latime-1)
{b[i][0]=str[i][dqmin[primmin]];
c[i][0]=str[i][dqmax[primmax]];}
for(j=1; j<nrcoloane; j++)
{
while (str[i][j]<str[i][dqmin[ultimmin]] && primmin <= ultimmin)
ultimmin--;
while(str[i][j]>str[i][dqmax[ultimmax]] && primmax <=ultimmax)
ultimmax--;
ultimmin++;
ultimmax++;
dqmin[ultimmin]=j;
dqmax[ultimmax]=j;
if(dqmin[primmin]==j-latime)
primmin++;
if(dqmax[primmax]==j-latime)
primmax++;
if(j>=latime-1)
{b[i][j]=str[i][dqmin[primmin]];
c[i][j]=str[i][dqmax[primmax]];
}
}
}
for(i=latime-1; i<nrcoloane; i++)
{
primmin=1;
ultimmin=0;
ultimmin++;
primmax=1;
ultimmax=0;
ultimmax++;
dqmin[ultimmin]=0;
dqmax[ultimmax]=0;
if(0>=lungime-1)
{
minim[0][i]=b[dqmin[primmin]][i];
maxim[0][i]=c[dqmax[primmax]][i];
}
for(j=1; j<nrlinii; j++)
{
while(b[j][i]<b[dqmin[ultimmin]][i] && primmin<=ultimmin)
ultimmin--;
while(c[j][i]>c[dqmax[ultimmax]][i] && primmax<=ultimmax)
ultimmax--;
ultimmin++;
ultimmax++;
dqmin[ultimmin]=j;
dqmax[ultimmax]=j;
if(dqmin[primmin]==j-lungime)
primmin++;
if(dqmax[primmax]==j-lungime)
primmax++;
if(j>=lungime-1)
{
minim[j][i]=b[dqmin[primmin]][i];
maxim[j][i]=c[dqmax[primmax]][i];
}
}
}
for(j=lungime-1; j<nrlinii; j++)
for(i=latime-1; i<nrcoloane; i++)
{if(maxim[j][i]-minim[j][i]<MIN)
{MIN=maxim[j][i]-minim[j][i]; nr=1;}//am calculat t lungimeXlatime
else
if(maxim[j][i]-minim[j][i]==MIN)
nr++;
}
if(latime!=lungime)
{for(i=0; i<nrlinii; i++)
{
primmin=1;
ultimmin=0;
primmax=1;
ultimmax=0;
ultimmax++;
ultimmin++;
dqmin[ultimmin]=0;
dqmax[ultimmax]=0;
if(0>=lungime-1)
{b[i][0]=str[i][dqmin[primmin]];
c[i][0]=str[i][dqmax[primmax]];}
for(j=1; j<nrcoloane; j++)
{
while (str[i][j]<str[i][dqmin[ultimmin]] && primmin <= ultimmin)
ultimmin--;
while(str[i][j]>str[i][dqmax[ultimmax]] && primmax <=ultimmax)
ultimmax--;
ultimmin++;
ultimmax++;
dqmin[ultimmin]=j;
dqmax[ultimmax]=j;
if(dqmin[primmin]==j-lungime)
primmin++;
if(dqmax[primmax]==j-lungime)
primmax++;
if(j>=lungime-1)
{b[i][j]=str[i][dqmin[primmin]];
c[i][j]=str[i][dqmax[primmax]];
}
}
}
for(i=lungime-1; i<nrcoloane; i++)
{
primmin=1;
ultimmin=0;
ultimmin++;
primmax=1;
ultimmax=0;
ultimmax++;
dqmin[ultimmin]=0;
dqmax[ultimmax]=0;
if(0>=latime-1)
{
minim[0][i]=b[dqmin[primmin]][i];
maxim[0][i]=c[dqmax[primmax]][i];
}
for(j=1; j<nrlinii; j++)
{
while(b[j][i]<b[dqmin[ultimmin]][i] && primmin<=ultimmin)
ultimmin--;
while(c[j][i]>c[dqmax[ultimmax]][i] && primmax<=ultimmax)
ultimmax--;
ultimmin++;
ultimmax++;
dqmin[ultimmin]=j;
dqmax[ultimmax]=j;
if(dqmin[primmin]==j-latime)
primmin++;
if(dqmax[primmax]==j-latime)
primmax++;
if(j>=latime-1)
{
minim[j][i]=b[dqmin[primmin]][i];
maxim[j][i]=c[dqmax[primmax]][i];
}
}
}
for(j=latime-1; j<nrlinii; j++)
for(i=lungime-1; i<nrcoloane; i++)
{if(maxim[j][i]-minim[j][i]<MIN)
{MIN=maxim[j][i]-minim[j][i]; nr=1;}//am calculat t lungimeXlatime
else
if(maxim[j][i]-minim[j][i]==MIN)
nr++;
}}
fprintf(fout, "%d %d\n", MIN, nr);
}
}