Cod sursa(job #566864)

Utilizator irene_mFMI Irina Iancu irene_m Data 29 martie 2011 12:57:36
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#define infile "plantatie.in"
#define outfile "plantatie.out"
#define MaxN 502
#define LgMaxN 11

int rmq[MaxN][MaxN][LgMaxN];
int lg[MaxN];
int i,j,k,l,N,M;

int maxim(int a,int b)
{
      if(a>b) return a;
      return b;
}

int main()
{
      freopen(infile,"r",stdin);
      freopen(outfile,"w",stdout);

      scanf("%d%d",&N,&M);
      for(i=1;i<=N;i++)
            for(j=1;j<=N;j++)
                  scanf("%d",&rmq[i][j][0]);

      for(i=2;i<=N;i++)
            lg[i]=lg[i/2]+1;

      for(k=1; 1<<k <=N; k++)
            for(i=1; i+ (1<<k)-1<=N; i++)
                  for(j=1; j+(1<<k)-1<=N;j++)
                        rmq[i][j][k]=maxim(maxim(rmq[i][j][k-1],rmq[i][j+(1<<(k-1))][k-1]),
                                     maxim(rmq[i+(1<<(k-1))][j][k-1],rmq[i+(1<<(k-1))][j+(1<<(k-1))][k-1]));

      for(;M;M--)
      {
            scanf("%d%d%d",&i,&j,&k);
            l=lg[k];
            printf("%d\n",maxim( maxim(rmq[i][j][l],rmq[i][j+k-(1<<l)][l]), maxim(rmq[i+k-(1<<l)][j][l],rmq[i+k-(1<<l)][j+k-(1<<l)][l])) );
      }

      fclose(stdin);
      fclose(stdout);
      return 0;
}