Cod sursa(job #1280860)

Utilizator MKLOLDragos Ristache MKLOL Data 2 decembrie 2014 17:10:02
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;

int rmq[505][505][12];
int N,M;
int lg[5050];
int get(int x,int y,int k){
    if(x > N || y > N)
        return 0;
    return rmq[x][y][k];
}
int main(){
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=1;i<=N;++i){
        for(int j=1;j<=N;++j){
            scanf("%d",&rmq[i][j][0]);
        }
    }
    lg[0]=0;
    for(int i=1;i<=500;++i){
        lg[i] = lg[i/2] + 1;
    }
    for(int k=1;k<=10;++k){
        for(int i=1;i<=N;++i){
            for(int j=1;j<=N;++j){
                int loc = (1<<(k-1));
                rmq[i][j][k] = max(max(get(i,j,k-1),get(i+loc,j,k-1)),max(get(i,j+loc,k-1),get(i+loc,j+loc,k-1)));
            }
        }
    }
    for(int i=1;i<=M;++i){
        int x,y,k;
        scanf("%d%d%d",&x,&y,&k);
        int sz = lg[k]-1;
        int loc = k-(1<<sz);
        //printf("%d %d %d %d\n",x,y,loc,sz);
        int ret = max(max(get(x,y,sz),get(x+loc,y,sz)),max(get(x,y+loc,sz),get(x+loc,y+loc,sz)));
        printf("%d\n",ret);
    }


    return 0;
}