Cod sursa(job #2784837)

Utilizator DragosC1Dragos DragosC1 Data 17 octombrie 2021 15:00:34
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <iostream>
using namespace std;

struct query {
    int i1, j1, i2, j2;
};

const int LOG = 9;

query Q[75001];
int n, m;
int a[501][501];
int RMQ[501][501][LOG + 1];
int lg[501];

void read() {
    int i, j, k;
    ifstream f("plantatie.in");
    f >> n >> m;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++) 
            f >> a[i][j];
    for (i = 1; i <= m; i++) {
        f >> Q[i].i1 >> Q[i].j1;
        f >> k;
        Q[i].i2 = Q[i].i1 + k - 1, Q[i].j2 = Q[i].j1 + k - 1;
    }
    f.close();
}

void solve() {
    int i, j, k, aux, Max;
    for (i = 2; i <= n; i++)
        lg[i] = lg[i / 2] + 1;
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= n; j++)
            RMQ[i][j][0] = a[i][j];
        for (j = 1; j <= LOG; j++)
            for (k = 1; k + (1 << j) - 1 <= n; k++)
                RMQ[i][k][j] = max(RMQ[i][k][j - 1], RMQ[i][k + (1 << (j - 1))][j - 1]);
    }

    ofstream g("plantatie.out");
    for (i = 1; i <= m; i++) {
        Max = 0;
        aux = lg[Q[i].j2 - Q[i].j1 + 1];
        for (j = Q[i].i1; j <= Q[i].i2; j++)
            Max = max(Max, max(RMQ[j][Q[i].j1][aux], RMQ[j][Q[i].j2 - (1 << aux) + 1][aux]));
        g << Max << '\n';
    }
    g.close();
}

int main() {
    read();
    solve();
    return 0;
}