Cod sursa(job #2790759)

Utilizator mariusn01Marius Nicoli mariusn01 Data 29 octombrie 2021 14:41:04
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#define DIM 502


int n,m,i1,i2,j1,j2,lat;
int A[DIM][DIM][10];

///A[i][j][k] = maximul dintr-un patrat de latura 2 la k care are coltul stanga sus in i,j

int maxim(int a, int b){
    if (a>b)
        return a;
    return b;
}

int main(){
    FILE *f = fopen("plantatie.in","r");
    FILE *g = fopen("plantatie.out","w");
    fscanf(f, "%d %d", &n, &m);
    for (int i=1;i<=n;i++){
        for (int j=1;j<=n;j++){
            fscanf(f, "%d", &A[i][j][0]);
        }
    }
    for (int k=1,p=2; p<=n; k++,p*=2){
        for (int i1=1;i1<=n-p+1;i1++){
            for (int j1=1;j1<=n-p+1;j1++){
                i2=i1+(p>>1);
                j2=j1+(p>>1);
                A[i1][j1][k] = maxim(maxim(A[i1][j1][k-1],A[i2][j1][k-1]),maxim(A[i1][j2][k-1],A[i2][j2][k-1]));
            }
        }
    }
    for (;m;m--){
        fscanf(f, "%d %d %d", &i1, &j1, &lat);
        int k,p;
        for (k=0,p=1;p<=lat;k++,p<<=1);
        p>>=1;k--;
        i2 = i1+lat-p;
        j2 = j1+lat-p;
        fprintf(g, "%d\n", maxim(maxim(A[i1][j1][k],A[i1][j2][k]),maxim(A[i2][j1][k],A[i2][j2][k])));
    }
    return 0;
}