Cod sursa(job #1792468)

Utilizator rotti321Rotar Mircea rotti321 Data 30 octombrie 2016 14:55:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
///RMQ(Range minimum query) Complexitate: O(N log N + M)

#include <bits/stdc++.h>
#define Nmax 100005

using namespace std;

int N,M,x,y,k,i,j;
int D[20][Nmax],lg[Nmax];

int main()
{
        ifstream f("rmq.in");
        ofstream g("rmq.out");

        f>>N>>M;

        lg[1]=0;  ///precalc log2(x)
        for (i=2;i<=N;i++)
                lg[i]=lg[i/2]+1;

        ///citim elementele vectorului care reprezinta prima linie a matricei ce retine dinamica
        for (i=1;i<=N;i++)
                f>>D[0][i];

        ///precalculam matricea cu ajutorul recurentei obtinute
        for (i=1;i<=lg[N];i++)
                for (j=1;j<=N-(1<<(i-1));j++)
                        D[i][j]=min(D[i-1][j],D[i-1][j+(1<<(i-1))]);

        for (i=1;i<=M;i++)
        {
                f>>x>>y; /// citim x si y, capetele intervalului pe care facem interogarea
                k=lg[y-x+1]; //aflam k in O(1)

                g<<min(D[k][x],D[k][y-(1<<k)+1])<<"\n"; ///afisam minimul pe intervalul [x,y]
        }

        return 0;
}