Cod sursa(job #1347827)

Utilizator Pintilie_AndreiFII-Pintilie Andrei Pintilie_Andrei Data 19 februarie 2015 11:49:49
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include <fstream>
#define N 505
using namespace std;
int rmq[10][N][N];
int a[N][N];
int lg[N];
int n,m;
void Lungime()
{
    lg[1]=0;
    for(int i=2; i<=n; i++)
        lg[i]=lg[i/2]+1;
}
void Create_Rmq()
{
    int i,j,p,k;
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
        rmq[0][i][j]=a[i][j];

    for(p=1; (1<<p)<=n; p++)
    {
        for(i=1<<p; i<=n; i++)
        {
        for(j=1<<p; j<=n; j++)
            {
                k=1<<(p-1);
                //cout<<rmq[p-1][i-k][j]<<" "<<rmq[p-1][i][j]<<" "<<rmq[p-1][i][j-k]<<" "<<rmq[p-1][i-k][j-k]<<"--";
                rmq[p][i][j]=min(rmq[p-1][i-k][j],rmq[p-1][i][j]);
                rmq[p][i][j]=min(rmq[p][i][j],rmq[p-1][i][j-k]);
                rmq[p][i][j]=min(rmq[p][i][j],rmq[p-1][i-k][j-k]);
                //cout<<rmq[p][i][j]<<"\n";
            }
            //cout<<"\n";
        }
    }
}
void Afisare()
{
    int i,j;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        cout<<rmq[1][i][j]<<" ";
        cout<<"\n";
    }

}
int main()
{
    ifstream fin("plantatie.in");
    fin>>n>>m;
    int i,j,d,sol,x,y,k,x2,y2;
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
        fin>>a[i][j];
    Lungime();
    Create_Rmq();
    //Afisare();
    for(i=1; i<=m; i++)
    {
        fin>>x>>y>>k;
        x2=x+k+1;
        y2=y+k+1;
        d=lg[k];
        sol=min(rmq[d][x+(1<<d)+1 ][y+(1<<d)+1],rmq[d][x+(1<<d)+1][y2]);
        sol=min(sol,rmq[d][x2][y+(1<<d)-1]);
        sol=min(sol,rmq[d][x2][y2]);
        cout<<sol<<" ";
    }
    return 0;
}