Cod sursa(job #931954)

Utilizator vendettaSalajan Razvan vendetta Data 28 martie 2013 16:53:44
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>

using namespace std;

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

#define nmax 501
#define Logmax 10
#define ll long long

int n, m, a[nmax][nmax], rmq[Logmax][nmax][nmax], Log[nmax];

void citeste(){
    f >> n >> m;
    for(int i=1; i<=n; ++i){
        for(int j=1; j<=n; ++j) f >> a[i][j];
    }
}

void rezolva(){
    // rmq 2D rmq[k][i][j] = maximul din patratul cu coltul stanga - sus in (i,j) si latura k
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=n; ++j){
            rmq[0][i][j] = a[i][j];
        }

    for(int k=1; k<Logmax; ++k){
        for(int i=1; i+(1<<k)-1<=n; ++i){
            for(int j=1; j+(1<<k)-1 <= n; ++j){
                rmq[k][i][j] = rmq[k-1][i][j];
                int newI = i + (1<<(k-1));
                rmq[k][i][j] = max(rmq[k][i][j], rmq[k-1][newI][j]);
                int newJ = j + (1<<(k-1));
                rmq[k][i][j] = max(rmq[k][i][j], rmq[k-1][i][newJ]);
                rmq[k][i][j] = max(rmq[k][i][j], rmq[k-1][newI][newJ]);
            }
        }
    }
    for(int i=2; i<=n; ++i) Log[i] = Log[i/2] + 1;

    int sus, st, k;
    for(int i=1; i<=m; ++i){
        f >> sus >> st >> k;
        int put = Log[k];
        int Max = rmq[put][sus][st];
        int dr = st + k - 1; int jos = sus + k - 1;
        int newSt = dr - (1<<put) + 1;
        Max = max(Max, rmq[put][sus][newSt]);
        int newSus = jos - (1<<put) + 1;
        Max = max(Max, rmq[put][newSus][st]);
        Max = max(Max, rmq[put][newSus][newSt]);
        //cout << Max << "\n";
        g << Max << "\n";
    }
}

int main(){
    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;
}