Cod sursa(job #1082897)

Utilizator tavi.belu1994FMI Belu Andrei Octavian tavi.belu1994 Data 15 ianuarie 2014 00:50:49
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;

FILE *f,*g;

int a[501][501],m[501][501][8];

int maxim(int a, int b, int c, int d)
{
    if(a>b && a>c && a>d) return a;
    if(b>a && b>c && b>d) return b;
    if(c>a && c>b && c>d) return c;
    else return d;
}

int rmq(int a,int b,int k)
{
   int h = log2(k);
   int K = (k-(1<<h)+1);
   return maxim( m[a][b][h] , m[a+K-1][b][h] , m[a][b+K-1][h] , m[a+K-1][b+K-1][h]);
}

int main()
{
    f=fopen("plantatie.in","r");
    g=fopen("plantatie.out","w");
    int i,j,k,x,y,r,n,nr;
    fscanf(f,"%d %d",&n,&nr);
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
          fscanf(f,"%d",&a[i][j]);
          m[i][j][0]=a[i][j];
        }
    }
    for(k=1;1<<k<=n;k++)
    {
        for(i=0;i+(1<<k)-1<n;i++)
        {
            for(j=0;j+(1<<k)-1<n;j++)
            {
                m[i][j][k] = maxim(m[i][j][k-1] , m[i][j+(1<<(k-1))][k-1] , m[i+(1<<(k-1))][j][k-1] , m[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);
            }
        }
    }
    for(i=1;i<=nr;i++)
    {
       fscanf(f,"%d %d %d",&x,&y,&r);
       fprintf(g,"%d\n",rmq(x-1,y-1,r));
    }
    fclose(f);
    fclose(g);
    return 0;
}