Cod sursa(job #3229805)

Utilizator AlkacineLezau Andrei Ianis Alkacine Data 17 mai 2024 16:37:07
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
    #include <bits/stdc++.h>
    #define INF 1000000000
    using namespace std;

    ifstream fin ("rmq.in");
    ofstream fout("rmq.out");

    const int MaxN = (int)(500) + 5;

    int r[32][MaxN][MaxN];
    int E[MaxN];

    int n, m;

    void gen_log(int n)
    {
        E[1] = 0;
        for (int i = 2; i <= n; i++) E[i] = 1 + E[i / 2];
    }

    int main ()
    {
        fin >> n >> m;
        gen_log(n);

        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                fin >> r[0][i][j];

        for (int p = 1, lat = 2; lat <= n; p++, lat *= 2)
            for (int i1 = 1; i1 <= n - lat + 1; i1++)
                for (int j1 = 1; j1 <= n - lat + 1; j1++)
                {
                    int i2 = i1 + (lat >> 1);
                    int j2 = j1 + (lat >> 1);
                    r[p][i1][j1] = max(r[p - 1][i1][j1],
                                   max(r[p - 1][i2][j1],
                                   max(r[p - 1][i1][j2],
                                       r[p - 1][i2][j2]
                                       )));
                }


        int L;
        int e, len;

        int i1, j1;
        int i2, j2;
        for (int i = 1; i <= m; i++)
        {
            fin >> i1 >> j1 >> L;
            e = E[L]; // e puterea lui 2 per juma' de interval
            len = (1 << e); //len lungime zona activa (de comparare?)

            i2 = i1 + L - len;
            j2 = j1 + L - len;

            fout << max(r[e][i1][j1],
                    max(r[e][i1][j2],
                    max(r[e][i2][j1],
                        r[e][i2][j2]
                        ))) << '\n';
        }
    }