Cod sursa(job #2592995)

Utilizator georgecristian2002Raducanu George-Cristian georgecristian2002 Data 2 aprilie 2020 18:03:38
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>

using namespace std;

int rmq[10][501][501];
int lg[501];

inline int maxi(int a, int b, int c, int d)
{
    if(a>b && a>c && a>d)
        return a;
    else
        if(b>a && b>c && b>d)
    {
        return b;
    }
    else
        if(c>a && c>b && c>d)
        {
            return c;
        }
    else
        return d;
}

int main() {
    ifstream fin("plantatie.in");
    ofstream fout("plantatie.out");
    int n, m;
    fin >> n >> m;
    lg[1] = 0;
    for (int i = 2; i <= n; i++) {
        lg[i] = 1 + lg[i / 2];
    }

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            fin >> rmq[0][i][j];
        }
    }

    int log = lg[n];
    for (int i = 1; (1<<i) <= n; i++) {
        int l = (1 << (i - 1));
        for (int j = (1 << i); j <= n; j++) {
            for (int k = (1 << i); k <= n; k++) {
                rmq[i][j][k] = maxi(rmq[i - 1][j][k],rmq[i - 1][j][k - l],rmq[i - 1][j - l][k], rmq[i - 1][j - l][k - l]);
            }
        }
    }
    for (int w=1; w<=m ; w++) {
        int a, b, lat;
        fin >> a >> b >> lat;
        a += lat - 1;
        b += lat - 1;
        int l = lg[lat];
        int pow = 1 << l;
        fout << maxi(rmq[l][a][b], rmq[l][a][b - lat + pow],rmq[l][a - lat + pow][b], rmq[l][a - lat + pow][b - lat + pow]) << '\n';
    }
    return 0;
}