Cod sursa(job #2432898)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 25 iunie 2019 13:42:23
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;
const int nmax=505;
int l[nmax],v[nmax][nmax],rmq[nmax][nmax][20],lg[nmax],a,b,k,n,m;
const int Lim = 10000000;

int u =  Lim - 1;

char s[Lim];



void Next () {

    if (++u == Lim)

        std::fread(s, 1, Lim, stdin), u = 0;

}



void Get (int &x) {

	x = 0;

    for (; s[u] < '0' || s[u] > '9'; Next());

    for (x = 0; s[u] >= '0' && s[u] <= '9'; Next())

           x = x * 10 + s[u] - '0';

}
void buildrmq()
{
    lg[1]=0;
    for(int i=2; i<=n; i++)
        lg[i]=lg[i/2]+1;
    for(int i=1; i<=n; i++)
        for(int j=1;j<=n;j++)
        rmq[i][j][0]=v[i][j];
    for(int l=1; l<=lg[n]; l++)
        for(int i=1; i<=n-(1<<l)+1; i++)
            for(int j=1;j<=n-(1<<l)+1;j++)
                rmq[i][j][l]=max(rmq[i][j][l-1],max(rmq[i+(1<<(l-1))][j][l-1],max(rmq[i][j+(1<<(l-1))][l-1],rmq[i+(1<<(l-1))][j+(1<<(l-1))][l-1])));
}
int answerrmq(int x,int y,int k)
{
    return max(rmq[x][y][lg[k]],max(rmq[x+k-(1<<(lg[k]))][y][lg[k]],max(rmq[x][y+k-(1<<(lg[k]))][lg[k]],rmq[x+k-(1<<(lg[k]))][y+k-(1<<(lg[k]))][lg[k]])));
}
int main()
{
    freopen("plantatie.in","r",stdin);
freopen("plantatie.out","w",stdout);
    Get(n); Get(m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
           Get(v[i][j]);
    buildrmq();
    for(int i=1;i<=m;i++)
    {
        Get(a); Get(b); Get(k);
        cout<<answerrmq(a,b,k)<<"\n";
    }
    return 0;
}