Cod sursa(job #937782)

Utilizator misinozzz zzz misino Data 11 aprilie 2013 00:18:34
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<fstream>
#include<cstring>
using  namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int n,m,t,i,j,x,y,cur,p1,p2,u1,u2,vf,sol,nr,mi[1010],ma[1010],mini[1010][1010],maxi[1010][1010],a[1010][1010];
int abs(int x)
{
    if(x<0)
    return -x;
    return x;
}
void rez(int x,int y)
{
    for(i=1;i<=n;++i)
    {
        p1=u1=p2=u2=1;
        vf=0;
        mi[1]=1;
        ma[1]=1;
        for(j=2;j<=m;++j)
        {
            while(p1<=u1&&a[i][j]<=a[i][mi[u1]])
            --u1;
            while(p2<=u2&&a[i][j]>=a[i][ma[u2]])
            --u2;
            ++u1;
            mi[u1]=j;
            ++u2;
            ma[u2]=j;
            if(y<=j-mi[p1])
            ++p1;
            if(y<=j-ma[p2])
            ++p2;
            if(j>=y)
            {
                ++vf;
                mini[i][vf]=a[i][mi[p1]];
                maxi[i][vf]=a[i][ma[p2]];
            }
        }
    }
    memset(mi,0,sizeof(mi));
    memset(ma,0,sizeof(ma));
    for(i=1;i<=vf;++i)
    {
        p1=p2=u1=u2=1;
        mi[1]=1;
        ma[1]=1;
        for(j=2;j<=n;++j)
        {
            while(p1<=u1&&mini[j][i]<=mini[mi[u1]][i])
            --u1;
            while(p2<=u2&&maxi[j][i]>=maxi[ma[u2]][i])
            --u2;
            ++u1;
            ++u2;
            mi[u1]=j;
            ma[u2]=j;
            if(x<=j-mi[p1])
            ++p1;
            if(x<=j-ma[p2])
            ++p2;
            if(j>=x)
            {
                cur=abs(maxi[ma[p2]][i]-mini[mi[p1]][i]);
                if(cur<sol)
                {
                    sol=cur;
                    nr=1;
                }
                else
                if(cur==sol)
                ++nr;
            }
        }
    }
}
int main()
{
    f>>n>>m>>t;
    for(i=1;i<=n;++i)
    for(j=1;j<=m;++j)
    f>>a[i][j];
    for(;t;--t)
    {
        sol=200000000;
        f>>x>>y;
        rez(x,y);
        if(x!=y)
        rez(y,x);
        g<<sol<<' '<<nr<<'\n';
    }
    return 0;
}