Cod sursa(job #1208295)

Utilizator PaueyPaula Nicoleta Gradu Pauey Data 15 iulie 2014 13:01:18
Problema Struti Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.05 kb
#include <iostream>
#include <fstream>
using namespace std;

int lg[8001];
int mint[10][10][1001][1001];
int maxt[10][10][1001][1001];

int main()
{
    ifstream cin("struti.in");
    ofstream cout("struti.out");
    int m, n, p, x, y;
    cin >> m >> n >> p;
    for(int i = 2; i <= 1000; ++i)
      lg[i] = lg[i/2] + 1;
    for(int i = 1; i <= m; ++i)
      for(int j = 1; j <= n; ++j) {
         cin >> maxt[0][0][i][j];
         mint[0][0][i][j] = maxt[0][0][i][j];
      }
   for(int j = 1; (1 << j) <= n; ++j)
      for(int k = 1; k <= m; ++k)
       for(int i = 1; i <= n - (1 << j) + 1; ++i) {
          mint[0][j][k][i] = min(mint[0][j - 1][k][i], mint[0][j - 1][k][i + (1 << (j - 1))]);
          maxt[0][j][k][i] = max(maxt[0][j - 1][k][i], maxt[0][j - 1][k][i + (1 << (j - 1))]);
       }
    for(int j = 1; (1 << j) <= n; ++j)
      for(int i = 1; i <= n; ++i)
       for(int k = 1; k <= m - (1 << j) + 1; ++k) {
          mint[j][0][k][i] = min(mint[j - 1][0][k][i], mint[j - 1][0][k + (1 << (j - 1))][i]);
          maxt[j][0][k][i] = max(maxt[j - 1][0][k][i], maxt[j - 1][0][k + (1 << (j - 1))][i]);
       }
   //pana aici e bine
    for(int lx = 1; (1 << lx) <= m; ++lx)
      for(int ly = 1; (1 << ly) <= n; ++ly)
       for(x = 1; x <= m - (1 << lx) + 1; ++x)
         for(y = 1; y <= n - (1 << ly) + 1; ++y) {
            mint[lx][ly][x][y] = min(min(mint[lx - 1][ly][x][y], mint[lx][ly - 1][x][y]), mint[lx - 1][ly - 1][x + (1 << (lx - 1))][y + (1 << (ly - 1))]);
            maxt[lx][ly][x][y] = max(max(maxt[lx - 1][ly][x][y], maxt[lx][ly - 1][x][y]), maxt[lx - 1][ly - 1][x + (1 << (lx - 1))][y + (1 << (ly - 1))]);
         }
    // si aico
    for(int i = 1; i <= p; ++i) {
      cin >> x >> y;
      int l1 = lg[x], l2 = lg[y];
      int nr = 0, dmin = 8000;
      for(int a = 1; a <= m; ++a)
         for(int b = 1; b <= n; ++b) {
            if(a + x - 1 <= m && b + y - 1 <= n) {
               int ch1 = max(max(maxt[l1][l2][a][b], maxt[l1][l2][a + x - (1 << l1)][b]), max(maxt[l1][l2][a][b + y - (1 << l2)], maxt[l1][l2][a + x - (1 << l1)][b + y - (1 << l2)])) - min(min(mint[l1][l2][a][b], mint[l1][l2][a + x - (1 << l1)][b]), min(mint[l1][l2][a][b + y - (1 << l2)], mint[l1][l2][a + x - (1 << l1)][b + y - (1 << l2)]));

               if(ch1 < dmin) {
                  nr = 1;
                  dmin = ch1;
               }
               else if(ch1 == dmin) ++nr;
            }
            if(a + y - 1 <= m && b + x - 1 <= n && x != y) {
               int ch2 = max(max(maxt[l2][l1][a][b], maxt[l2][l1][a + y - (1 << l2)][b]), max(maxt[l2][l1][a][b + x - (1 << l1)], maxt[l2][l1][a + y - (1 << l2)][b + x - (1 << l1)])) - min(min(mint[l2][l1][a][b], mint[l2][l1][a + y - (1 << l2)][b]), min(mint[l2][l1][a][b + x - (1 << l1)], mint[l2][l1][a + y - (1 << l2)][b + x - (1 << l1)]));
               if(ch2 < dmin) {
                  nr = 1;
                  dmin = ch2;
               }
               else if(ch2 == dmin) ++nr;
            }
         }
      cout << dmin << ' ' << nr << '\n';
    }
    return 0;
}