Cod sursa(job #1298508)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 22 decembrie 2014 21:37:22
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, q, rmq[2][100003], v[100003],sol[100010], i, a[100003], l, x, y, m, mlc, MLC, mLc, MlC, MLc, mlC, mLC;
struct asd
{
    int x,y,r;
}e[100010];
bool crit(asd a,asd b)
{
    return (a.y-a.x)>(b.y-b.x);
}
inline void run(int N)
{
    int l, r, i, lg, LG;
    for(i = 1; i <= n; i++)
        rmq[0][i] = v[i];
    for(lg = 1, LG = 2, m = 1; LG <= N; LG <<= 1, lg <<= 1, m = 1 - m)
        for(l = 1, r = LG; r <= n; l++, r++)
            rmq[m][l] = min(rmq[1 - m][l], rmq[1 - m][l + lg]);
}
int main()
{
    fin >> n >> q;
    for(i = 2; i <= n; i <<= 1)
        a[i] = 1;
    for(i = 1; i <= n; i++)
        a[i] += a[i - 1];
    for(i = 1; i <= n; i++)
        fin >> v[i];
    l = 1 << 30;
    for(i=1;i<=q;i++)
    {
        fin>>x>>y;
        e[i].x=x;
        e[i].y=y;
        e[i].r=i;
    }
    sort(e+1,e+q+1,crit);
    for(i=1;i<=q;i++)
    {
        //fin >> x >> y;
        x=e[i].x;
        y=e[i].y;
        if(a[y - x + 1 ] < l)
        {
            l = a[y - x + 1];
            run(1 << (l+1));
        }
        sol[e[i].r]=min(rmq[m][x], rmq[m][y - (1 << (l)) + 1]);
    }
    for(i=1;i<=q;i++)
        fout<<sol[i]<<'\n';
    return 0;
}