Cod sursa(job #2476190)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 18 octombrie 2019 11:50:30
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<cstdio>
#include<algorithm>

const int NMAX=505;

long long mat[NMAX][NMAX][10],logg[NMAX];
int n,m;

inline long long max(long long x, long long y){
	if(x>y)
        return x;
	return y;
}

void logaritm(){
	int x=0;
	for(int i=0;i<=n;i++)
		if((1<<x)>i)
			logg[i]=x-1;
		else
            logg[i]=x++;
}

void rmq(){
	for(int i=n;i>=1;i--)
		for(int j=n;j>=1;j--)
			for(int k=1;i+(1<<k)<=n+1 && j+(1<<k)<=n+1;k++)
				mat[i][j][k]=max(max(mat[i][j][k-1], mat[i+(1<<(k-1))][j][k-1]), max(mat[i][j+(1<<(k-1))][k-1], mat[i+(1<<(k-1))][j+(1<<(k-1))][k-1]));
}
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("%lld", &mat[i][j][0]);
	rmq();
	logaritm();
	for(int t=1;t<=m;t++){
        int i,j,k;
		scanf("%d%d%d", &i, &j, &k);
		int l=logg[k];
		long long sol=max(max(mat[i][j][l], mat[k-(1<<l)+i][j][l]), max(mat[i][j+k-(1<<l)][l], mat[i+k-(1<<l)][j+k-(1<<l)][l]));
		printf("%lld\n", sol);
	}
	return 0;
}