Cod sursa(job #1679101)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 7 aprilie 2016 18:05:28
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <iostream>
using namespace std;

int v[510][510][12];
int log[550];
int n, m;

void calc();
int maxim(int x, int y, int z, int t);
int maxim(int x, int y);

int main()
{
    ifstream in("plantatie.in");
    in >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++)
            in >> v[i][j][0];
    }
 //   for (int i = 1; i <= n; i++) {
 //       for (int j = 1; j <= n; j++)
 //           cout << v[i][j][0] << ' ';
//        cout << '\n';
 //   }
    calc();

    int a, b, l, k;
    ofstream out("plantatie.out");
    while (m--) {
        in >> a >> b >> k;
        a += k - 1;
        b += k - 1;
        l = log[k];
        out << maxim(v[a][b][l], v[a][b - k + (1 << l)][l], v[a - k + (1 << l)][b][l], v[a - k + (1 << l)][b - k + (1 << l)][l]) << '\n';
    }

    return 0;
}


void calc() {

    for (int i = 2; i <= 510; i++)
        log[i] = 1 + log[i / 2];

    for (int i = 2; i <= n; i++) {
        for (int j = 2; j <= n; j++) {
            for (int k = 1; (1 << k) <= n; k++) {
                if (i - (1 << (k - 1)) < 0 || j - (1 << (k - 1)) < 0)
                    continue;
                v[i][j][k] = maxim(v[i][j][k - 1], v[i][j - (1 << (k - 1))][k - 1], v[i - (1 << (k - 1))][j][k - 1], v[i - (1 << (k - 1))][j - (1 << (k - 1))][k - 1]);
            }
        }
    }
}

int maxim(int x, int y) {
    return x > y ? x : y;
}

int maxim(int x, int y, int z, int t) {
    return maxim(maxim(x, y), maxim(z, t));
}