Cod sursa(job #19806)

Utilizator astronomyAirinei Adrian astronomy Data 19 februarie 2007 23:49:34
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <stdio.h>
#include <algorithm>
using namespace std;

#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MAXN 512
#define MAX_M (1 << 17)

typedef struct query { int x, y, k, ind; } query;

int N, M, A[MAXN][MAXN];
int ans[MAX_M];
query Q[MAX_M];

int cmp(query a, query b)
{
    return a.k < b.k;
}

void solve(void)
{
    int i, j, k, t, r, p;

    sort(Q+1, Q+M+1, cmp);
    
    t = 1;

    while(Q[t].k < 2 && t <= M)
        ans[Q[t].ind] = A[ Q[t].x ][ Q[t].y ], t++;

    for(k = 1; (1<<k) <= N; k++)
    {
        for(i = 1; i <= N-(1<<k)+1; i++)
         for(j = 1; j <= N-(1<<k)+1; j++)
            r = MAX(A[i][j], A[i][j+(1<<(k-1))]),
            r = MAX(r, A[i+(1<<(k-1))][j]),
            r = MAX(r, A[i+(1<<(k-1))][j+(1<<(k-1))]),
            A[i][j] = r;
            
        while(Q[t].k < (1<<(k+1)) && t <= M)
        {
            i = Q[t].x, j = Q[t].y, p = Q[t].k;
            r = MAX(A[i][j], A[i+p-(1<<k)][j]);
            r = MAX(r, A[i][j+p-(1<<k)]);
            r = MAX(r, A[i+p-(1<<k)][j+p-(1<<k)]);
            ans[Q[t].ind] = r, t++;
        }
    }
}

void read_data(void)
{
    int i, j, x, ind;
    char sir[1<<14];

    scanf("%d %d\n", &N, &M);

    for(i = 1; i <= N; i++)
    {
        fgets(sir, 1<<14, stdin), ind = 0;
        for(j = 1; j <= N; j++)
        {
            x = 0;
            for(; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
                x = x*10+(sir[ind]-48);
            A[i][j] = x, ind++;
        }
     }
     
    for(i = 1; i <= M; i++)
    {
        fgets(sir, 1024, stdin), ind = x = 0;
        for(; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
            x = x*10+(sir[ind]-48);
        Q[i].x = x;
        for(ind++, x = 0; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
            x = x*10+(sir[ind]-48);
        Q[i].y = x;
        for(ind++, x = 0; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
            x = x*10+(sir[ind]-48);
        Q[i].k = x, Q[i].ind = i;
    }
}

void write_data(void)
{
    int i;

    for(i = 1; i <= M; i++)
        printf("%d\n", ans[i]);
}

int main(void)
{
    freopen("plantatie.in", "rt", stdin);
    freopen("plantatie.out", "wt", stdout);

    read_data();
    solve();
    write_data();

    return 0;
}