Cod sursa(job #1694182)

Utilizator Bodo171Bogdan Pop Bodo171 Data 24 aprilie 2016 21:16:52
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <iostream>
#include<fstream>
using namespace std;
int a[1005][1005],mn[1005][1005],mx[1005][1005],q,p1,p2,u1,u2,n,m,d[1005],dmx[1005],x,y,minim,nr;
int main()
{
    ifstream f("struti.in");
    ofstream g("struti.out");
    f>>n>>m>>q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
    {
        f>>a[i][j];
    }
    for(int contor=1;contor<=q;contor++)
    {
        nr=0;minim=8005;
        f>>x>>y;
        for(int k=1;k<=2;k++)
        {
        for(int i=1;i<=n;i++)
        {
            p1=1;u1=0;
            p2=1;u2=0;
            for(int j=1;j<=m;j++)
        {
            if(j-d[p1]>=y) p1++;
            while(p1<=u1&&a[i][j]<a[i][d[u1]])
                u1--;
            u1++;
            d[u1]=j;
            if(j-dmx[p2]>=y) p2++;
            while(p2<=u2&&a[i][j]>a[i][dmx[u2]])
                u2--;
            u2++;
            dmx[u2]=j;
            mn[i][j]=a[i][d[p1]];
            mx[i][j]=a[i][dmx[p2]];
        }

        }

        for(int j=y;j<=m;j++)
        {
            p1=1;u1=0;
            p2=1;u2=0;
            for(int i=1;i<=n;i++)
            {
            if(i-d[p1]>=x) p1++;
            while(p1<=u1&&mn[i][j]<mn[d[u1]][j])
                u1--;
            u1++;
            d[u1]=i;
            if(i-dmx[p2]>=x) p2++;
            while(p2<=u2&&mx[i][j]>mx[dmx[u2]][j])
                u2--;
            u2++;
            dmx[u2]=i;
            if(i>=x)
            {
                if(mx[dmx[p2]][j]-mn[d[p1]][j]<minim)
                {
                    minim=mx[dmx[p2]][j]-mn[d[p1]][j];

                    nr=1;
                }
                else
                    if(mx[dmx[p2]][j]-mn[d[p1]][j]==minim)
                {
                    nr++;
                }
            }
            }
        }
        if(x!=y)swap(x,y);
        else k=2;
        }
        g<<minim<<' '<<nr<<'\n';
    }

    return 0;
}