Cod sursa(job #1443289)

Utilizator RathebaSerbanescu Andrei Victor Ratheba Data 27 mai 2015 15:20:05
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <vector>

using namespace std;

const int MAX = 100000;

vector<int> mat[18];  //log de MAX
int v[MAX], n, m, vlog[MAX];

void precalc();
void afis();

int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    int x, y, lin, sol;
    scanf("%d%d", &n, &m);
    for(int i=1; i<=n; i++)
        scanf("%d", v + i);
    precalc();
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d", &x, &y);
        lin = vlog[y-x+1];
        (v[mat[lin][x]] < v[mat[lin][y-(1<<lin)+1]]) ? sol = v[mat[lin][x]] : sol = v[mat[lin][y-(1<<lin)+1]];
        printf("%d\n", sol);
    }
    //afis();
    return 0;
}
void afis()
{
    vector<int>::iterator it;
    for(int i=0; i<=vlog[n]; i++)
    {
        for(it=mat[i].begin(); it!=mat[i].end(); ++it)
            printf("%3d ", *it);
        printf("\n");
    }
}
void precalc()
{
    int i, j;
    for(i=2; i<=n; i++)
        vlog[i] = 1 + vlog[i/2];
    for(i=0; i<=vlog[n]; i++)
        mat[i].push_back(0);
    for(i=1; i<=n; i++)
        mat[0].push_back(i);
    for(i=1; i<=vlog[n]; i++)
    {
        for(j=1; j<=n-(1<<i)+1; j++)
        {
            if(v[mat[i-1][j]] < v[mat[i-1][j+(1<<(i-1))]])
                mat[i].push_back(mat[i-1][j]);
            else
                mat[i].push_back(mat[i-1][j+(1<<(i-1))]);

        }
    }
}