Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <deque>
- #define NMAX 1005
- using namespace std;
- ifstream fin("struti.in");
- ofstream fout("struti.out");
- int mat[NMAX][NMAX], n, m, p, lg1, lg2;
- deque<int> maxxL[NMAX], minnL[NMAX], maxxC, minnC, auxM[NMAX], auxMa[NMAX], aux1, aux2;
- void addL(int i, int j){
- while(!minnL[i].empty() && minnL[i].back() > mat[i][j])
- minnL[i].pop_back();
- minnL[i].push_back(mat[i][j]);
- while(!maxxL[i].empty() && maxxL[i].back() < mat[i][j])
- maxxL[i].pop_back();
- maxxL[i].push_back(mat[i][j]);
- }
- void addC(int i){
- while(!minnC.empty() && minnC.back() > minnL[i].front())
- minnC.pop_back();
- minnC.push_back(minnL[i].front());
- while(!maxxC.empty() && maxxC.back() < maxxL[i].front())
- maxxC.pop_back();
- maxxC.push_back(maxxL[i].front());
- }
- int solve(int l, int c, int& lg){
- for(int i = 1; i <= n; ++i)
- minnL[i].clear(), maxxL[i].clear();
- maxxC.clear();
- minnC.clear();
- for(int j = 1; j <= c; ++j)
- for(int i = 1; i <= l; ++i)
- addL(i, j);
- for(int i = 1; i <= l; ++i)
- addC(i);
- int minD = (1 << 30);
- for(int i = l; i <= n; ++i){
- aux1 = maxxC;
- aux2 = minnC;
- for(int k = i - l + 1; k <= n; ++k)
- auxM[k] = minnL[k], auxMa[k] = maxxL[k];
- for(int j = c; j <= m; ++j){
- int val = maxxC.front() - minnC.front();
- if(val < minD){
- minD = val;
- lg = 0;
- }
- if(val == minD)
- ++lg;
- for(int k = i - l + 1; k <= i; ++k){
- if(mat[k][j - c + 1] == maxxL[k].front()){
- if(maxxC.front() == maxxL[k].front())
- maxxC.pop_front();
- maxxL[k].pop_front();
- }
- if(mat[k][j - c + 1] == minnL[k].front()){
- if(minnC.front() == minnL[k].front())
- minnC.pop_front();
- minnL[k].pop_front();
- }
- addL(k, j + 1);
- addC(k);
- }
- }
- maxxC = aux1;
- minnC = aux2;
- for(int k = i - l + 1; k <= i; ++k)
- minnL[k] = auxM[k], maxxL[k] = auxMa[k];
- if(maxxC.front() == maxxL[i - l + 1].front())
- maxxC.pop_front();
- if(minnC.front() == minnL[i - l + 1].front())
- minnC.pop_front();
- for(int j = 1; j <= c; ++j)
- addL(i + 1, j);
- addC(i + 1);
- }
- return minD;
- }
- int main()
- {
- fin >> n >> m >> p;
- for(int i = 1; i <= n; ++i)
- for(int j = 1; j <= m; ++j)
- fin >> mat[i][j];
- for(int i = 1; i <= p; ++i){
- int dx, dy;
- fin >> dx >> dy;
- lg1 = 0, lg2 = 0;
- int val1 = solve(dx, dy, lg1);
- int val2 = solve(dy, dx, lg2);
- if(val1 == val2)
- fout << val1 << ' ' << lg1 + lg2 << '\n';
- else {
- if(val1 < val2)
- fout << val1 << ' ' << lg1 << '\n';
- else fout << val2 << ' ' << lg2 << '\n';
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement