Cod sursa(job #2226277)

Utilizator inquisitorAnders inquisitor Data 30 iulie 2018 01:14:44
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>
#define LOG(x) for(k=0;(1<<k)<=(x);k++);--k;
using namespace std;

#define MAX_OUT 7000000
#define MAX_BUFF 65536 * 2
int ptr = MAX_BUFF;
char c, buff[MAX_BUFF];
int result, now;
char out[MAX_OUT];
int ss, dig[8];

inline char getChar() {
  if (ptr == MAX_BUFF) {
    fread(buff, 1, MAX_BUFF, stdin);
    ptr = 0;
  }
  return buff[ptr++];
}

inline int freef() {
  result = 0;
  do {
    c = getChar();
  } while (!isdigit(c));
  do {
    result = (result << 3) + (result << 1) + c - '0';
    c = getChar();
  } while (isdigit(c));
  return result;
}

inline void put(int x) {
  if (x == 0) {
    dig[ss++] = 0;
  }
  while (x) {
    result = x / 10;
    dig[ss++] = x - (result << 3) - (result << 1);
    x = result;
  }

  while (ss) {
    out[now++] = dig[ss - 1] + '0';
    ss--;
  }
  out[now++] = '\n';
}


int n,m,k;
int RMQ[17][100001]= {0};

void read_data()
{
    freopen("rmq.in", "r", stdin);

    n = freef();

    m = freef();

    for(int i=1; i<=n; i++)  RMQ[0][i] = freef();
}

void compute()
{
    for(int i=0; i<16; i++)
        for(int j=1; j<n-i; j++)
            RMQ[i+1][j]=min(RMQ[i][j],RMQ[i][j+(1<<i)]);
}

void answer()
{
    freopen("rmq.out", "w", stdout);

    while(m--)
    {
        int x = freef(), y = freef();

        LOG(y-x+1);
        put(min(RMQ[k][x],RMQ[k][y+1-(1<<k)]));
    }

    fwrite(out, 1, now, stdout);
}

int main()
{
    read_data();
    compute();
    answer();
}