Cod sursa(job #3308629)

Utilizator Maryy_1369Gociu Maria Anastasia Maryy_1369 Data 26 august 2025 18:11:24
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <fstream>
#include<deque>
#include<algorithm>
#include<queue>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");
int n,m,p;
int v[1006][1006];
int maxiv[1006][1006],miniv[1006][1006];

pair<int,int>sol(int x,int y){
   int ans=(1<<30), cnt=0;
   for(int i=1;i<=n;i++){
     deque<int>mini,maxi;
     for(int j=1;j<=m;j++){
         while(!mini.empty() && v[i][j]<=v[i][mini.back()]){
            mini.pop_back();
         }
         while(!maxi.empty() && v[i][j]>=v[i][maxi.back()]){
            maxi.pop_back();
         }
         mini.push_back(j);
         maxi.push_back(j);
         if(mini.front()==j-y)mini.pop_front();
         if(maxi.front()==j-y)maxi.pop_front();
         if(j>=y){
             miniv[i][j]=v[i][mini.front()];
             maxiv[i][j]=v[i][maxi.front()];
         }
     }

   }

   for(int j=y;j<=m;j++){
      deque<int>mini,maxi;
      for(int i=1;i<=n;i++){
         while(!mini.empty() && miniv[i][j]<=miniv[mini.back()][j])mini.pop_back();
         while(!maxi.empty() && maxiv[i][j]>=maxiv[maxi.back()][j])maxi.pop_back();

         mini.push_back(i);
         maxi.push_back(i);
         if(mini.front()==i-x)mini.pop_front();
         if(maxi.front()==i-x)maxi.pop_front();
         if(i>=x){
            if(maxiv[maxi.front()][j]-miniv[mini.front()][j]<ans){
                 ans=maxiv[maxi.front()][j]-miniv[mini.front()][j];
                 cnt=1;
            }
            else if(maxiv[maxi.front()][j]-miniv[mini.front()][j]==ans)cnt++;
         }
      }
   }
   return {ans,cnt};
}
int main()
{
  cin>>n>>m>>p;
  for(int i=1;i<=n;i++){
     for(int j=1;j<=m;j++){
         cin>>v[i][j];
     }
  }
  int x,y;
  for(int i=1;i<=p;i++){
      cin>>x>>y;
      if(x==y){
          pair<int,int>ans=sol(x,y);
          cout<<ans.first<<" "<<ans.second<<endl;
      }
      else {
        pair<int,int>ans1=sol(x,y);
        pair<int,int>ans2=sol(y,x);
        if(ans1.first<ans2.first){
             cout<<ans1.first<<" "<<ans1.second<<endl;
        }
        else if(ans1.first>ans2.first){
            cout<<ans2.first<<" "<<ans2.second<<endl;
        }
        else{
             cout<<ans1.first<<" "<<ans1.second+ans2.second<<endl;
        }
      }
  }
}