Cod sursa(job #2623288)

Utilizator dianapingu1Diana Vasiliu dianapingu1 Data 2 iunie 2020 21:32:34
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int v[17][100001];
int lg[100001];

int main()
{
    int n,m;
    fin>>n>>m;
    for (int i=0; i<n; i++)
        fin>>v[0][i];

    int putere = 1;
    int logN = log2(n);
    for (int i=1; i<=logN; i++) {
        for (int j=0; j + putere*2 - 1 < n; j++) {
            v[i][j] = min(v[i-1][j], v[i-1][j+putere]);
        }
        putere *= 2;
    }

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

    int x,y,dist;
    for (int i=0; i<m; i++) {
        fin>>x>>y;
        dist = lg[y-x+1];
        fout<<min(v[dist][x-1], v[dist][y-(int)pow(2,dist)])<<'\n';
    }

    fin.close();
    fout.close();

    return 0;

}
































































//#include <bits/stdc++.h>
//
//using namespace std;
//
//ifstream fin("rmq.in");
//ofstream fout("rmq.out");
//
//int arb[300005];
//
//void update(int nod, int st, int dr, int idx, int val)
//{
//    if (st == dr) {
//        arb[nod] = val;
//        return;
//    }
//    int mij = st + (dr-st)/2;
//
//    if (idx <= mij)
//        update(2*nod, st, mij, idx, val);
//    else
//        update(2*nod + 1, mij+1, dr, idx, val);
//
//    arb[nod] = min(arb[2*nod], arb[2*nod+1]);
//}
//
//int maxim(int nod, int st, int dr, int l, int r)
//{
//    if (l <= st && dr <= r)
//        return arb[nod];
//
//    int mij = st + (dr-st)/2;
//    int left = 1e9, right = 1e9;
//
//    if (l <= mij)
//        left = maxim(2*nod, st, mij, l, r);
//    if (r > mij)
//        right = maxim(2*nod+1, mij+1, dr, l, r);
//
//    return min(left,right);
//}
//
//
//int main()
//{
//    int n,m,a,b;
//
//    fin>>n>>m;
//    for (int i=1; i<=n; i++) {
//        fin>>a;
//        update(1,1,n,i,a);
//    }
//
//    for (int i=0; i<m; i++) {
//        fin>>a>>b;
//        fout<<maxim(1,1,n,a,b)<<'\n';
//    }
//
//    fin.close();
//    fout.close();
//
//    return 0;
//}