Cod sursa(job #3358346)

Utilizator Andrei_GAndreiG Andrei_G Data 16 iunie 2026 13:33:22
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <iostream>
#pragma GCC optimize("O3,unroll-loops")
#include <algorithm>
#include <cstring>
#include <climits>
#include <iomanip>
#include <numeric>
#include <bitset>
#include <string>
#include <vector>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
//#define int long long
//#define int short
#define pb push_back
#define f first
#define s second
using namespace std;

const int nmax = 500;
const int lg = 9;
const int qmax = 75e3;

int n, m, v[nmax + 5][nmax + 5], q;

int spt[nmax + 5][nmax + 5][lg + 1];

class RMQ{
public:
    RMQ(){
        build();
    }
    int query(int i, int j, int l){
        int k = __lg(l);
        return max(max(spt[i][j][k],
                       spt[i + l - (1 << k)][j][k]),
                   max(spt[i][j + l - (1 << k)][k],
                       spt[i + l - (1 << k)][j + l - (1 << k)][k]));
    }

private:
    void build(){
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= n; j++){
                spt[i][j][0] = v[i][j];
            }
        }
        for (int k = 1; k <= lg; k++){
            for (int i = 1; i <= n - (1 << k) + 1; i++){
                for (int j = 1; j <= n - (1 << k) + 1; j++){
                    spt[i][j][k] = max(max(spt[i][j][k - 1],
                                           spt[i + (1 << (k - 1))][j][k - 1]),
                                       max(spt[i][j + (1 << (k - 1))][k - 1],
                                           spt[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1]));
                }
            }
        }
    }

};

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin>>n>>q;
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= n; j++){
            cin>>v[i][j];
        }
    }
    RMQ table = RMQ();
    while (q--){
        int i, j, l;
        cin>>i>>j>>l;
        cout<<table.query(i, j, l)<<"\n";
    }
}