Cod sursa(job #2628218)

Utilizator k2e0e0w3qDumitrescu Gheorghe k2e0e0w3q Data 15 iunie 2020 01:50:21
Problema Plantatie Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <ctype.h>
#define N 500
#define log(x) 31-__builtin_clz(x)

int read () {
    int ch;
    while (!isdigit(ch=getchar_unlocked()));

    int ans=0;
    do
        ans = (ans<<3) + (ans<<1) + ch - '0';
    while (isdigit(ch=getchar_unlocked()));
    
    return ans;
}

void print (int a) {
    if (a) {
        print(a/10);
        putchar_unlocked(a%10+'0');
    }
}

int max (int a, int b, int c, int d) {return a>=b && a>=c && a>=d ? a:
                                             b>=a && b>=c && b>=d ? b:
                                             c>=a && c>=b && c>=d ? c:
                                                                    d;}
int seg[log(N)+1][N][N];
int main (void) {
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);

    int n=read(), m=read(), i, j, k;
    for (i=0; i<n; ++i)
        for (j=0; j<n; ++j)
            seg[0][i][j]=read();
    
    for (k=1; (1<<k) <= n; ++k)
        for (i=0; i + (1<<k) <= n; ++i)
            for (j=0; j + (1<<k) <= n; ++j)
                seg[k][i][j]=max(seg[k-1][i][j], seg[k-1][i][j + (1<<k-1)], seg[k-1][i + (1<<k-1)][j], seg[k-1][i + (1<<k-1)][j + (1<<k-1)]);

    int lg;
    for (; m; m--) {
        i=read()-1;
        j=read()-1;
        k=read();
        lg=log(k);
        print(max(seg[lg][i][j], seg[lg][i][j - (1<<lg) + k], seg[lg][i - (1<<lg) + k][j], seg[lg][i - (1<<lg) + k][j - (1<<lg) + k]));
        putchar_unlocked('\n');
    }
    return 0;
}