Cod sursa(job #1598696)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 13 februarie 2016 11:13:11
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <vector>
using namespace std;

FILE * is = fopen("plantatie.in", "r");
FILE * os = fopen("plantatie.out", "w");

using VI = vector<int>;
using VVI = vector<VI>;
using VVVI = vector<VVI>;

void Read();
void RMQ();
void Query();

int n, m;
VI log2;
VVVI r;

int main()
{
    Read();
    RMQ();
    Query();
    fclose(is);
    fclose(os);
    return 0;
}

void Query()
{
    int i, j, k, val;
    while ( m-- )
    {
        fscanf(is, "%d%d%d", &i, &j, &k);
        val = log2[k];
        fprintf(os, "%d\n", max(max(r[i][j][val], r[i + k - ( 1 << val )][j + k - ( 1 << val )][val]), max(r[i + k - ( 1 << val )][j][val], r[i][j + k - ( 1 << val )][val])));
    }
}

void RMQ()
{
    log2 = VI(n + 1);
    for ( int i = 2; i <= n; ++i )
        log2[i] = log2[i / 2] + 1;
    for ( int k = 1; ( 1 << k ) <= n; ++k )
        for ( int i = 1; i + ( 1 << k ) - 1 <= n; ++i )
            for ( int j = 1; j + ( 1 << k ) - 1 <= n; ++j )
                r[i][j][k] = max(max(r[i][j][k - 1], r[i + ( 1 << ( k - 1 ) )][j + ( 1 << ( k - 1 ) )][k - 1]), max(r[i + ( 1 << ( k - 1 ) )][j][k - 1], r[i][j + ( 1 << ( k - 1 ) )][k - 1]));
}

void Read()
{
    fscanf(is, "%d%d", &n, &m);
    r = VVVI(n + 1, VVI(n + 1, VI(10)));
    for ( int i = 1; i <= n; ++i )
        for ( int j = 1; j <= n; ++j )
            fscanf(is, "%d", &r[i][j][0]);
}