Cod sursa(job #1310404)

Utilizator AeroHHorea Stefan AeroH Data 6 ianuarie 2015 20:04:03
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 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;

void constructRMQ(int l)
    {
        int i,j;
        for (i=1;i<=n;++i)
            rmq[0][l][i]=m[l][i];

        for (i=1;i<=9;++i)
            for(j=1;j<=n-(1<<(i-1))+1;++j)
                rmq[i][l][j] = max ( rmq[i-1][l][j] , rmq[i-1][l][j + (1 << (i-1))] );
    }

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)
        {
            doi[i]=d;
            if (1<<d==i)
                d++;;
        }
    for (i=1;i<=n;++i)
        {
            constructRMQ(i);
        }
    while(Q--)
        {
            f>>x>>y>>k;
            maxi=-1<<31;
            for (i=x;i<=x+k-1;++i)
                {
                    t1=rmq[doi[k]-1][i][y];
                    t2=rmq[doi[k]-1][i][k+y-(1<<(doi[k]-1))];
                    maxi=max(maxi,max(t1,t2));

                }
            g<<maxi<<'\n';

        }

    return 0;
}