Cod sursa(job #2289545)

Utilizator mister_adyAdrian Catana mister_ady Data 24 noiembrie 2018 19:39:44
Problema Arbori de intervale Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 2.02 kb
package segmenttree;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Scanner;

public class Main {

    public static final String IN_FILE = "arbint.in";
    public static final String OUT_FILE = "arbint.out";


    public static void main(String[] args) throws FileNotFoundException {

        final Scanner scanner = new Scanner(new FileInputStream(IN_FILE));
        final PrintStream writer = new PrintStream(OUT_FILE);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int arr[] = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        Tree tree = new Tree(arr);
        for (int i = 0; i < m; i++) {
            int x = scanner.nextInt();
            int a = scanner.nextInt();
            int b = scanner.nextInt();
            if (x == 0) {
                writer.println(tree.query(a, b, 1, n, 1));
            } else {
                tree.update(a, b, 1, n, 1);
            }
        }

    }

    static class Tree {
        int arb[];

        public Tree(int arr[]) {
            arb = new int[arr.length * 4];
            for (int i = 0; i < arr.length; ++i) {
                update(i + 1, arr[i], 1, arr.length, 1);
            }
        }

        void update(int pos, int val, int l, int r, int nod) {
            if (r == l) {
                arb[nod] = val;
                return;
            }

            int m = (r + l) / 2;
            if (pos <= m) update(pos, val, l, m, 2 * nod);
            else update(pos, val, m + 1, r, 2 * nod + 1);

            arb[nod] = Math.max(arb[nod * 2], arb[nod * 2 + 1]);
        }

        int query(int a, int b, int l, int r, int nod) {
            if (a <= l && b >= r)
                return arb[nod];
            int m = (l + r) / 2;

            int m1 = -1, m2 = -1;

            if (a <= m) m1 = query(a, b, l, m, nod * 2);
            if (b > m) m2 = query(a, b, m + 1, r, nod * 2 + 1);

            return Math.max(m1, m2);
        }
    }
}