Cod sursa(job #2903303)

Utilizator biancar28Radulescu Alexia-Bianca biancar28 Data 17 mai 2022 13:03:34
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
//#include <iostream>
//#include <bits/stdc++.h>
//
//using namespace std;
//
//ifstream f("rmq.in");
//ofstream g("rmq.out");
//
//#define A 100005
//#define B 17
//
//int M[A][B];
//
//struct Query {
//    int st, dr;
//};
//
//
//void preprocess(int v[], int n)
//{
//    int i,j;
//
//    for(i=0; i<n; i++)
//        M[i][0]=i;
//
//    for(j=1; (1<<j)<=n; j++)
//    {
//        for (i=0; (i+(1<<j)-1)<n; i++)
//        {
//            if (v[M[i][j-1]] < v[M[i+(1<<(j-1))][j-1]])
//                M[i][j] = M[i][j-1];
//            else
//                M[i][j]=M[i+(1<<(j-1))][j-1];
//        }
//    }
//}
//
//int query(int v[], int st, int dr)
//{
//    int j=(int)log2(dr-st+1);
//
//    if (v[M[st][j]]
//        <= v[M[dr-(1<<j)+1][j]])
//        return v[M[st][j]];
//
//    else
//        return v[M[dr-(1<<j)+1][j]];
//}
//
//void RMQ(int v[], int n, Query q[], int m)
//{
//    int i,st,dr;
//
//    preprocess(v,n);
//
//    for (i=0; i<m; i++)
//    {
//        st=q[i].st;
//        dr=q[i].dr;
//        g<< query(v,st,dr) << endl;
//    }
//}
//
//int main()
//{
//    int n,m,i,a,b;
//    f>>n>>m;
//    int v[n];
//    for(i=0;i<n;i++)
//    {
//        f>>v[i];
//    }
//
//    Query q[m];
//    for(i=0;i<m;i++)
//    {
//        f>>a;
//        a=a-1;
//        q[i].st=a;
//        f>>b;
//        b=b-1;
//        q[i].dr=b;
//    }
//
//    RMQ(v,n,q,m);
//
//    return 0;
//}


#include <iostream>
#include <vector>
#include <fstream>

using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
#define nr 100005
#define l 18

long int R[l][nr], log[nr], v[nr];

int main()
{
    long int n,m,i,j,x,y,t;
    f>>n>>m;

    for (i=1;i<=n;i++){
        f>>R[0][i];
    }

    log[1]=0;
    for (i=2;i<=n;i++){
        log[i]=log[i/2]+1;
    }

    for (i=1; (1<<i)<=n; i++){
        for (j=1; j+(1<<i)-1<=n; j++){
            R[i][j]= min(R[i-1][j],R[i-1][j+(1<<(i-1))] );
        }
    }

    for (i=1;i<=m;i++)
    {
        f>>x;
        f>>y;
        t=log[y-x+1];
        g<<min(R[t][x],R[t][y+1-(1<<t)])<<"\n";
    }
    return 0;
}