Cod sursa(job #2784843)

Utilizator DragosC1Dragos DragosC1 Data 17 octombrie 2021 15:15:49
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 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, LOG1, LOG2, Min;
    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 (k = 1; k <= LOG; k++)
        for (i = 1; i <= n - (1 << k) + 1; i++)
            for (j = 1; j <= n - (1 << k) + 1; j++)
                RMQ[i][j][k] = max(max(RMQ[i][j][k - 1], RMQ[i][j + (1 << (k - 1))][k - 1]), max(RMQ[i + (1 << (k - 1))][j][k - 1], RMQ[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1]));

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

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