Cod sursa(job #2903289)

Utilizator biancar28Radulescu Alexia-Bianca biancar28 Data 17 mai 2022 12:35:50
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <bits/stdc++.h>
#define A 100005
#define B 17
using namespace std;

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

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;
}