Cod sursa(job #1741571)

Utilizator greenadexIulia Harasim greenadex Data 14 august 2016 13:39:10
Problema Arbori de intervale Scor 100
Compilator java Status done
Runda Arhiva educationala Marime 3.13 kb
import java.io.*;
import java.util.Arrays;

public class Main {
    private static int[] v;
    private static int[] arbint = new int[(int)4e5 + 20];

    private static int[] parseLine(String line, int nr) {
        int[] result = new int[nr];
        int number = 0;

        int k = 0;
        for (int i = 0; i < line.length(); i++) {
            char character = line.charAt(i);
            if (character >= '0' && character <= '9') {
                number = number * 10 + (character - '0');
            } else {
                result[k++] = number;
                number = 0;
            }
        }
        if (k != nr) {
            result[k] = number;
        }

        return result;
    }

    private static void createArb(int node, int left, int right) {
        if (left == right) {
            arbint[node] = v[left - 1];
            return;
        }

        int leftChild = node * 2;
        int rightChild = node * 2 + 1;
        int mid = (left + right) / 2;

        createArb(leftChild, left, mid);
        createArb(rightChild, mid + 1, right);

        arbint[node] = Math.max(arbint[leftChild], arbint[rightChild]);
    }

    private static int getMax(int node, int left, int right, int a, int b) {
        if (a <= left && b >= right)
            return arbint[node];

        int leftChild = node * 2;
        int rightChild = node * 2 + 1;
        int mid = (left + right) / 2;

        int max = 0;
        if (a <= mid) {
            max = Math.max(max, getMax(leftChild, left, mid, a, b));
        }
        if (b > mid) {
            max = Math.max(max, getMax(rightChild, mid + 1, right, a, b));
        }

        return max;
    }


    private static void updateValue(int node, int left, int right, int pos, int newValue) {
        if (left == right) {
            arbint[node] = newValue;
            return;
        }

        int leftChild = node * 2;
        int rightChild = node * 2 + 1;
        int mid = (left + right) / 2;

        if (pos <= mid)
            updateValue(leftChild, left, mid, pos, newValue);
        else updateValue(rightChild, mid + 1, right, pos, newValue);

        arbint[node] = Math.max(arbint[leftChild], arbint[rightChild]);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("arbint.in"));
        BufferedWriter writer = new BufferedWriter(new FileWriter("arbint.out"));


        String first = reader.readLine();
        int[] numbers = parseLine(first, 2);

        int n = numbers[0];
        int q = numbers[1];

        String second = reader.readLine();

        v = parseLine(second, n);
        createArb(1, 1, n);


        for (int i = 0; i < q; i++) {
            numbers = parseLine(reader.readLine(), 3);

            int queryType = numbers[0];
            int a = numbers[1];
            int b = numbers[2];

            if (queryType == 0) {
                int max = getMax(1, 1, n, a, b);
                writer.write(Integer.toString(max));
                writer.newLine();
            } else {
                updateValue(1, 1, n, a, b);
            }
        }

        reader.close();
        writer.close();
    }
}