Cod sursa(job #2429161)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 8 iunie 2019 00:53:17
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <cstdio>
using namespace std;
const int NMAX = 100001;
int v[NMAX];
int p2[17];
int log[NMAX];
int t[NMAX][17];
int min(int a, int b){
    return a < b ? a : b;
}
int max(int a, int b){
    return a > b ? a : b;
}
void creare_rmq(int n){
    int i,j;
    for(i=1;i<=n;i++)
        t[i][0] = v[i];
    for(j=1;p2[j]<=n;j++)
        for(i=1;i<=n && (i + p2[j] - 1) <= n;i++)
            t[i][j] = min(t[i][j-1], t[i+p2[j-1]][j-1]);
}
int rmq(int x, int y){
    int elemente = y - x + 1;
    int seturi = log[elemente];
    int ramase = elemente - p2[seturi];
    return min(t[x][seturi], t[x + ramase][seturi]);
}
int main()
{
    FILE *fin, *fout;
    int n,m,i,x,y,ans;
    fin = fopen("rmq.in","r");
    fout = fopen("rmq.out","w");
    fscanf(fin,"%d %d",&n,&m);
    for(i=1;i<=n;i++)
        fscanf(fin,"%d",&v[i]);
    p2[0] = 1;
    log[1] = 0;
    for(i=1;p2[i-1]<=n;i++){
        p2[i] = p2[i - 1] * 2;
        log[p2[i]] = i;
    }
    for(i=2;i<=n;i++)
        log[i] = max(log[i-1], log[i]);
    creare_rmq(n);
    for(i=1;i<=m;i++){
        fscanf(fin,"%d %d",&x,&y);
        ans = rmq(x, y);
        fprintf(fout,"%d\n",ans);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}