Cod sursa(job #1280165)

Utilizator hellol30FMI Macovei Daniel hellol30 Data 1 decembrie 2014 15:35:06
Problema Range minimum query Scor 40
Compilator java Status done
Runda Arhiva educationala Marime 1.58 kb
//package temeJava;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;

public class Main {
    static int d[][];
    static int a[];
    static int n, m;
    
    static void process() {
    
        for (int i = 0; i < n; i++)
            d[i][0] = a[i];
        for (int j = 1; (1 << j) <= n; j++)
            for (int i = 0; i + (1 << j) <= n; i++)
                d[i][j] = Math.min(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]);
    }
    
    static int querry(int x, int y) {
    
        int lg = y - x + 1;
        int pw = 0;
        while ((1 << pw) <= lg)
            pw++;
        pw--;
        return Math.min(d[x - 1][pw], d[y - (1 << pw)][pw]);
    }
    
    public static void main(String args[]) throws IOException {
    
        BufferedReader br = new BufferedReader(new FileReader("rmq.in"));
        String line = br.readLine();
        n = Integer.valueOf(line.split(" ")[0]);
        m = Integer.valueOf(line.split(" ")[1]);
        a = new int[n];
        d = new int[n][20];
        for (int i = 0; i < n; i++) {
            line = br.readLine();
            a[i] = Integer.valueOf(line);
        }
        process();
        PrintWriter printer = new PrintWriter("rmq.out");
        for (int i = 0; i < m; i++) {
            line = br.readLine();
            int x = Integer.valueOf(line.split(" ")[0]);
            int y = Integer.valueOf(line.split(" ")[1]);
            printer.printf("%d\n", querry(x, y));
        }
        printer.close();
        br.close();
    }
}