Cod sursa(job #2244871)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 23 septembrie 2018 22:19:50
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#include <cmath>

using namespace std;

int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    int n, m, i, j, mins_m, x, y;

    scanf("%d%d", &n, &m);
    int sir[n+1];

    for(i=1; i<=n; ++i)
        scanf("%d", &sir[i]);

    mins_m = (int)log2(n);

    int mins[n+1][mins_m];
    for(i=1; i<=n; ++i)
        mins[i][0] = i;
    for(j=1; j<=mins_m; ++j)
        for(i=1; i<=n; ++i)
        if(i + (1<<(j-1)) <= n)
            {
                if (sir[mins[i][j-1]] < sir[mins[i + (1<<(j-1))][j-1]])
                    mins[i][j] = mins[i][j-1];
                else
                    mins[i][j] = mins[i + (1<<(j-1))][j-1];
            }
        else
            mins[i][j] = mins[i][j-1];

    for(i=1; i<=m; ++i)
    {
        scanf("%d%d", &x, &y);
        if (x == y)
        {
            printf("%d\n", sir[mins[x][0]]);
            continue;
        }

        j = log2(y-x+1);
        if (y-(1<<j) +1 > 0)
            if (sir[mins[x][j]] < sir[mins[y-(1<<j)+1][j]])
                printf("%d\n", sir[mins[x][j]]);
            else
                printf("%d\n", sir[mins[y-(1<<j)+1][j]]);
        else
            printf("%d\n", sir[mins[x][j]]);
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}