Advertisement
RaFiN_

2d sparse table

Aug 15th, 2020
1,171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.46 KB | None | 0 0
  1. //2d sparse table
  2. #include<bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. #define ll long long
  7.  
  8. const int mod = 1e9 + 7;
  9.  
  10. const int N = 5e5 + 10;
  11.  
  12. int arr[501][501],table[501][501][40];int n,q;
  13.  
  14. void init() {
  15.     for(int k = 0;(1<<k)<=n;k++) {
  16.         for(int i = 1;i+(1<<k)-1<=n;i++) {
  17.             for(int j = 1;j+(1<<k)-1<=n;j++) {
  18.                 if(k == 0) {
  19.                     table[i][j][k] = arr[i][j];
  20.                 }
  21.                 else {
  22.                     int a=1<<(k-1);
  23.                     table[i][j][k]=max(max(table[i][j][k-1],table[i+a][j][k-1]),max(table[i][j+a][k-1],table[i+a][j+a][k-1]));
  24.                 }
  25.             }
  26.         }
  27.     }
  28. }
  29.  
  30. int main() {
  31.     ios_base::sync_with_stdio(0); cin.tie(0);
  32.     //freopen("input.txt", "r", stdin);
  33.     //freopen("output.txt", "w", stdout);
  34.     int t;
  35.     scanf("%d",&t);
  36.     int ajinka = 1;
  37.     while(t--) {
  38.         scanf("%d%d",&n,&q);
  39.         memset(table,0,sizeof(table));
  40.         for(int i = 1;i<=n;i++) {
  41.             for(int j = 1;j<=n;j++) {
  42.                 scanf("%d",&arr[i][j]);
  43.             }
  44.         }
  45.         init();
  46.         printf("Case %d:\n",ajinka++);
  47.         while(q--) {
  48.             int i,j,s;
  49.             scanf("%d%d%d",&i,&j,&s);
  50.             int k = log2(s);
  51.             int a = (1<<k);
  52.             int ans = max(max(table[i][j][k],table[i+s-a][j][k]),max(table[i][j+s-a][k],table[i+s-a][j+s-a][k]));
  53.             printf("%d\n",ans);
  54.         }
  55.     }
  56.  
  57.     return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement