Cod sursa(job #1310513)

Utilizator AeroHHorea Stefan AeroH Data 6 ianuarie 2015 22:18:15
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <iostream>
#include <vector>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <queue>
#include <set>
#include <map>
#include <fstream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <algorithm>
#include <numeric>
#define ll long long int
#define punct pair<ll,ll>
#define mp make_pair
#define MOD 10000007
#define NMAX 505
using namespace std;

ifstream f("plantatie.in");
ofstream g("plantatie.out");

int n,Q,i,j,m[NMAX][NMAX],rmq[10][NMAX][NMAX],x,y,k,maxi,doi[NMAX],t1,t2,t3,t4,t;

void constructRMQ()
    {
        int i,j,k,p1,p2,p3,p4;
        for (i=1;i<=n;++i)
            for (j=1;j<=n;++j)
                rmq[0][i][j]=m[i][j];

        for (k=0;k<9;++k)
            for (i=1;i<=n;++i)
                for (j=1;j<=n;++j)
                    {
                        t=(1<<k);
                        p1=rmq[k][i][j];
                        p2=rmq[k][i][j+t];
                        p3=rmq[k][i+t][j];
                        p4=rmq[k][i+t][j+t];
                        rmq[k+1][i][j]=max(max(p1,p2),max(p3,p4));///max(p1,max(p2,max(p3,p4)))
                    }
    }

int main()
{
    f>>n>>Q;
    for (i=1;i<=n;++i)
        for (j=1;j<=n;++j)
            f>>m[i][j];

    int d=1;

    for (i=1;i<=n;++i)
        {
            if (1<<d==i)
                d++;;
            doi[i]=d-1;
        }

    constructRMQ();

    /*for(i=1;i<=n;++i,g<<'\n')
        for(j=1;j<=n;++j)
            g<<rmq[2][i][j]<<" ";*/

    while(Q--)
        {
            f>>x>>y>>k;

            t=k-(1<<(doi[k]));

            t1=rmq[doi[k]][x][y];
            t2=rmq[doi[k]][x][y+t];
            t3=rmq[doi[k]][x+t][y];
            t4=rmq[doi[k]][x+t][y+t];

            maxi=max(max(t1,t2),max(t3,t4));

            g<<maxi<<'\n';

        }

    return 0;
}