Cod sursa(job #1081319)

Utilizator stanescu.raduRadu Stanescu stanescu.radu Data 13 ianuarie 2014 15:24:54
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#include <math.h>
 
using namespace std;

ifstream f ("plantatie.in");
ofstream g("plantatie.out");
 
int v[505], RMQ[10][505][505];
int i, n, m, j, l, lg, x, y, k;

void init()
{
    v[1] = 0;
    for(int i = 2; i <= 505; i ++)
        v[i] = v[i/2] + 1;
}

int main()
{
    init();
	f >> n >> m;
    for(i = 1; i <= n; i ++)
        for(j = 1; j <= n; j ++)
            f >> RMQ[0][i][j];
    lg = v[n];
    int maxx;
    for(l = 1; l <= lg; l ++)
        for(i = 1; i + (1<<(l - 1)) <= n; i ++)
            for(j = 1; j + (1<<(l - 1)) <= n; j ++)
                {
                RMQ[l][i][j] = RMQ[l - 1][i][j];
                RMQ[l][i][j] = max(RMQ[l - 1][i][j], RMQ[l - 1][i + (1<<(l - 1))][j]);
                RMQ[l][i][j] = max(RMQ[l][i][j], RMQ[l - 1][i][j + (1 << (l - 1))]);
                RMQ[l][i][j] = max(RMQ[l][i][j], RMQ[l - 1][i + (1 << (l - 1))][j + (1 << ( l - 1))]);
                }
    for(i = 0 ; i < m; i ++)
    {
        f >> x >> y >> k;
        maxx = max(RMQ[v[k]][x][y], RMQ[v[k]][ x + k - (1<<v[k]) ][y]);
        maxx = max(maxx, RMQ[v[k]][x][ y + k -(1 << v[k])]);
        maxx = max(maxx, RMQ[v[k]][x + k - (1<<v[k])][y + k - (1<<v[k])] );
        g << maxx << "\n";
    }
	f.close();
	g.close();
	return 0;
}