Cod sursa(job #2637332)

Utilizator bem.andreiIceman bem.andrei Data 22 iulie 2020 15:04:06
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <bits/stdc++.h>
using namespace std;
ifstream r("struti.in");
ofstream w("struti.out");
int rez, n, m, dx, dy, q, na, nb, a, b, l1, l2, k1, k2, nr, z;
int v[1005][1005],mx[1005][1005],mn[1005][1005];
struct per
{
    int h,p;
} l[1005],k[1005];
int do_dx_dy(int dx,int dy)
{
    nr=0;
    short rz=10000;
    for(int j=1; j<=m; j++)
    {
        l1=k1=1;
        l2=k2=0;
        for(int i=1; i<=n; i++)
        {
            z=v[i][j];
            if(l[l1].p==i-dx){
                l1++;
            }
            while(l2>=l1 && l[l2].h<=z){
                l2--;
            }
            l[++l2]= {z,i};
            mx[i][j]=l[l1].h;
            if(k[k1].p==i-dx){
                k1++;
            }
            while(k2>=k1 && k[k2].h>=z){
                k2--;
            }
            k[++k2]= {z,i};
            mn[i][j]=k[k1].h;
        }
    }
    for(int i=dx; i<=n; i++)
    {
        l1=k1=1;
        l2=k2=0;
        for(int j=1; j<=m; j++)
        {
            z=mx[i][j];
            if(l[l1].p==j-dy){
                l1++;
            }
            while(l2>=l1 && l[l2].h<=z){
                l2--;
            }
            l[++l2]= {z,j};
            z=mn[i][j];
            if(k[k1].p==j-dy){
                k1++;
            }
            while(k2>=k1 && k[k2].h>=z){
                k2--;
            }
            k[++k2]= {z,j};
            if(j>=dy)
            {
                z=l[l1].h-k[k1].h;
                if(z<rz){
                    rz=z;
                    nr=0;
                }
                if(z==rz){
                    nr++;
                }
            }
        }
    }
    return rz;
}
int main()
{
    r>>n>>m>>q;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            r>>v[i][j];
        }
    }
    while(q--)
    {
        r>>dx>>dy;
        if(dx==dy)
        {
            a=do_dx_dy(dx,dy);
            na=nr;
            w<<a<<" "<<na<<"\n";
        }
        else
        {
            a=do_dx_dy(dx,dy);
            na=nr;
            b=do_dx_dy(dy,dx);
            nb=nr;
            if(a<b){
                w<<a<<" "<<na<<"\n";
            }
            if(a>b){
                w<<b<<" "<<nb<<"\n";
            }
            if(a==b){
                w<<a<<" "<<na+nb<<"\n";
            }
        }
    }
}