Cod sursa(job #162272)

Utilizator cretuMusina Rares cretu Data 19 martie 2008 20:27:12
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>
#define MAXN 100001
#define mini(a, b) ((a) < (b) ? (a) : (b))

using namespace std;

int lg[MAXN], a[MAXN];
int rmq[MAXN][18];
int m, n;

int main()
{
        int i, j, k, x, y;
        ifstream fin("rmq.in");
        fin >> n >> m;
        for (i = 1; i <= n; i++)
             fin >> a[i];

        lg[1] = 0;
        for (i = 2; i <= n; i++)
             lg[i] = lg[i/2] + 1;

        for (i = 1; i <= n; i++)
             rmq[i][0] = a[i];

        for (j = 1; (1 << j) <= n; j++)
             for (i = 1; i + (1 << (j-1))  <= n; i++)
                  rmq[i][j] = mini(rmq[i][j-1], rmq[i+(1<<(j-1))][j-1]);

        ofstream fout("rmq.out");
        for (i = 1; i <= m; i++)
        {
             fin >> x >> y;
             k = lg[y-x];
             fout << mini(rmq[x][k], rmq[y-(1<<k)+1][k]) << "\n";
        }
        fout.close();
        fin.close();

        return 0;
}