Cod sursa(job #1681375)

Utilizator preda.andreiPreda Andrei preda.andrei Data 9 aprilie 2016 13:32:59
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <iostream>
#include <cstdio>

using namespace std;

int mat[501][501];
int maxim[501][501][12];

int plantatieMax(int x, int y, int l);
int alegeMaxim(int a, int b, int c, int d);
void inter(int &a, int &b);

int main()
{
    FILE *fin = fopen("plantatie.in", "r");
    FILE *fout = fopen("plantatie.out", "w");

    int n, t, x, y, lat, rez, col1, col2;

    fscanf(fin, "%d%d", &n, &t);
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= n; ++j){
            fscanf(fin, "%d", &mat[i][j]);
            maxim[i][j][0] = mat[i][j];
        }
    }

    for(int i = n; i >= 1; --i){
        //fprintf(fout, "\n%d\n", i);
        for(int j = n; j >= 1; --j){
            //fprintf(fout, "%d: ", j);
            for(int k = 1; j + (1 << (k - 1)) <= n && i + (1 << (k - 1)) <= n; ++k){
                maxim[i][j][k] = alegeMaxim(maxim[i][j][k - 1], maxim[i][j + (1 << (k - 1))][k - 1],
                                       maxim[i + (1 << (k - 1))][j][k - 1], maxim[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1]);
                //fprintf(fout, "%d ", maxim[i][j][k]);
            }
            //fprintf(fout, "\n");
        }
    }

    while(t--){
        fscanf(fin, "%d%d%d", &x, &y, &lat);
        fprintf(fout, "%d\n", plantatieMax(x, y, lat));
    }


    return 0;
}

int alegeMaxim(int a, int b, int c, int d){
    if(a < b)
        inter(a, b);
    if(c < d)
        inter(c, d);
    if(a < c)
        inter(a, c);
    return a;
}

int plantatieMax(int x, int y, int l){
    int k = 0;

    while((1 << k) < l)
        ++k;

    if((1 <<k) == l)
        return maxim[x][y][k];

    --k;
    return alegeMaxim(maxim[x][y][k], maxim[x][y + l - (1 << k)][k],
                      maxim[x + l - (1 << k)][y][k], maxim[x + l - (1 << k)][y + l - (1 << k)][k]);
}

void inter(int &a, int &b){
    int aux = a;
    a = b;
    b = aux;
}