Cod sursa(job #1016160)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 25 octombrie 2013 20:52:26
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>
using namespace std;

int n, m, i, j, mat[20][100002], p[100002], ln, nr , st, dr;

int main()
{
    ifstream f("rmq.in");
    ofstream g("rmq.out");
    f>>n;f>>m;
    ln=0;nr=1;
    while(nr<n)
    {
        nr=(nr<<1);
        ln++;
    }
    for(i=1;i<=n;i++)
        f>>mat[0][i];
    for(i=1;i<=ln;i++)
    for(j=1;j<=n;j++)
    {
        if(mat[i-1][j+(1<<(i-1))]<mat[i-1][j] && (j+(1<<(i-1)))<=n)
            mat[i][j]=mat[i-1][j+(1<<(i-1))];
        else
            mat[i][j]=mat[i-1][j];
    }
    p[1]=0;
    for(i=2;i<=n;i++)
        p[i]=p[i/2]+1;
    for(i=1;i<=m;i++)
    {
        f>>st;f>>dr;
        if(mat[p[dr-st+1]][st]<mat[p[dr-st+1]][dr-(1<<p[dr-st+1])+1])
            g<<mat[p[dr-st+1]][st]<<"\n";
        else
            g<<mat[p[dr-st+1]][dr-(1<<p[dr-st+1])+1]<<"\n";
    }
    f.close();g.close();
    return 0;
}