Cod sursa(job #2275381)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 3 noiembrie 2018 10:03:19
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX=5e2+5;

int N, M, i, j, k, X, Y, L;

int Lg, p2, Left, Right;

int RMQ[31][NMAX][NMAX];

int log2 (int N)
{
    int putere=1;
    int exponent=0;

    while(putere<N)
    {
        putere*=2;
        exponent++;
    }

    if(putere>N)
    {
        putere/=2;
        exponent--;
    }

    return exponent;
}

int main()
{
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);

    scanf("%d%d", &N, &M);

    for(i=1; i<=N; i++)
        for(j=1; j<=N; j++)
            scanf("%d", &RMQ[0][i][j]);

    for(i=1; i<=log2(N); i++)
        for(j=1; j<=(N-(1<<i)+1); j++)
            for(k=1; k<=(N-(1<<i)+1); k++)
                RMQ[i][j][k]=max(RMQ[i-1][j][k], max(RMQ[i-1][j][k+(1<<(i-1))], max(RMQ[i-1][j+(1<<(i-1))][k], RMQ[i-1][j+(1<<(i-1))][k+(1<<(i-1))])));

    for(i=1; i<=M; i++)
    {
        scanf("%d%d%d", &X, &Y, &L);

        Lg=log2(L);

        p2=(1<<Lg);

        Left=X+L-1;

        Right=Y+L-1;
        printf("%d\n", max(RMQ[Lg][X][Y], max(RMQ[Lg][X][Right-p2+1], max(RMQ[Lg][Left-p2+1][Y], RMQ[Lg][Left-p2+1][Right-p2+1]))));
    }
    return 0;
}