Advertisement
Hezov

RMQ in 2D pe dreptunghiuri (Euclid 60p)

Jun 28th, 2024
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.89 KB | None | 0 0
  1. #include <fstream>
  2. #include <algorithm>
  3. using namespace std;
  4. ifstream cin("euclid.in");
  5. ofstream cout("euclid.out");
  6. int R[10][10][401][401], E[401];
  7. int main()
  8. {
  9.     int t,n,m,h,w;
  10.     cin>>t;
  11.     for(int i = 2;i<=400;i++)
  12.         E[i] = E[i/2] + 1;
  13.     for(int testcase = 1;testcase<=t;testcase++)
  14.     {
  15.         cin>>n>>m>>h>>w;
  16.         for(int i = 1;i<=n;i++)
  17.             for(int j = 1;j<=m;j++)
  18.                 cin>>R[0][0][i][j];
  19.         for(int q = 0; (1<<q)<= n; q++)
  20.             for(int p = 0;(1<<p)<=m;p++)
  21.                 for(int i = 1;i<=n;i++)
  22.                     for(int j = 1;j<=m;j++)
  23.                     {
  24.                         int f1 = i + (1<<(max(q-1,0)));
  25.                         int f2 = j + (1<<(max(p-1,0)));
  26.                         R[q][p][i][j] = R[max(q-1,0)][max(p-1,0)][i][j];
  27.                         if(f1<=n)
  28.                             R[q][p][i][j] = __gcd(R[q][p][i][j],R[(q-1,0)][max(q-1,0)][f1][j]);
  29.                         if(f2<=m)
  30.                             R[q][p][i][j] = __gcd(R[q][p][i][j],R[max(q-1,0)][max(p-1,0)][i][f2]);
  31.                         if(f1<=n&&f2<=m)
  32.                             R[q][p][i][j] = __gcd(R[q][p][i][j],R[max(q-1,0)][max(p-1,0)][f1][f2]);
  33.                     }
  34.         int sol = -1e9;
  35.         for(int i = 1;i<=n-h+1;i++)
  36.             for(int j = 1;j<=m-w+1;j++)
  37.             {
  38.                 int e1 = E[h];
  39.                 int e2 = E[w];
  40.                 int len1 = (1<<e1);
  41.                 int len2 = (1<<e2);
  42.                 int val1 = R[e1][e2][i][j];
  43.                 int val2 = R[e1][e2][i+h-len1][j];
  44.                 int val3 = R[e1][e2][i][j+w-len2];
  45.                 int val4 = R[e1][e2][i+h-len1][j+w-len2];
  46.                 int current = __gcd(__gcd(val1,val2),__gcd(val3,val4));
  47.                 sol = max(sol,current);
  48.             }
  49.         cout<<"Case #"<<testcase<<": "<<sol<<'\n';
  50.     }
  51.     return 0;
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement