Cod sursa(job #178978)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 15 aprilie 2008 13:52:11
Problema Plantatie Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#include <stdlib.h>
#define N 510
#define LOG 18
int v[N][N];
int n,m;
int rmq[LOG][N][N];
int logx[N];
int max(int a,int b){   return (a>b)?a:b;   }
void logar(){
   int i,x=1,y=0;
   for (i=1;i<N;++i)
      if (i<(x<<1))
        logx[i]=y;
      else{
        x<<=1;
        logx[i]=++y;
      }
}
void pre_compute(){
   int i,j,k;
   for (k=1;k<=logx[n];++k)
      for (i=1;i+(1<<k)<=n+1;++i)
         for (j=1;j+(1<<k)<=n+1;++j)
             rmq[k][i][j]=max(max(rmq[k-1][i][j],rmq[k-1][i][j+(1<<(k-1))]),
                              max(rmq[k-1][i+(1<<(k-1))][j],rmq[k-1][i+(1<<(k-1))][j+(1<<(k-1))]));
}
void querry(int i,int j,int c){
   int L,z;
   L=logx[c];
   z=max ( max( rmq[L][i][j] , rmq[L][i][j+c-(1<<L)] ),
         max( rmq[L][i+c-(1<<L)][j] , rmq[L][i+c-(1<<L)][j+c-(1<<L)] ) );
   printf("%d\n",z);
}
int main(){
	int i,j,c;
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	scanf("%d%d",&n,&m);
	logar();
	for (i=1;i<=n;++i)
		for (j=1;j<=n;++j){
			scanf("%d",&v[i][j]);
			rmq[0][i][j]=v[i][j];
		}
	pre_compute();
	while (m--){
		scanf("%d%d%d",&i,&j,&c);
		querry(i,j,c);
	}
	exit(0);
}