Cod sursa(job #2349353)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 20 februarie 2019 13:32:57
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <iostream>
using namespace std;
FILE *in,*out;

int n,mm;
int log2[510],m[12][502][502];

void read(){
    fscanf(in,"%d %d",&n,&mm);
    for(int i=1;i<n;i++)
        for(int j=1;j<=n;j++)
            fscanf(in,"%d",&m[0][i][j]);
    int i,j,l;
     for(int w=1;w<=mm;w++)
        fscanf(in,"%d %d %d",&i,&j,&l);
}

void form_log(){
    log2[2]=1;
    for(int i=2;i<=504;i++)
        log2[i]=log2[i/2]+1;
}

void solve(){
    for(int k=1;k<=log2[n];k++)
        for(int i=1;i<=n-(1<<k)+1;i++)
            for(int j=1;j<=n-(1<<k)+1;j++)
                m[k][i][j]=max(max(m[k-1][i][j],m[k-1][i][j+(1<<(k-1))]),max(m[k-1][i+(1<<(k-1))][j],m[k-1][i+(1<<(k-1))][j+(1<<(k-1))]));
}

void write(){
    int l,i,j,lv,sol;
    for(int w=1;w<=mm;w++){
        fscanf(in,"%d %d %d",&i,&j,&l);
        lv=log2[l];
        sol=max(max(m[lv][i][j],m[lv][i][j+l-(1<<lv)]),max(m[lv][i+l-(1<<lv)][j],m[lv][i+l-(1<<lv)][j+l-(1<<lv)]));
        fprintf(out,"%d\n",sol);
    }
}

int main(){
    in=fopen("plantatie.in","r");
    out=fopen("plantatie.out","w");
    read();
    form_log();
    solve();
    write();
    return 0;
}