Cod sursa(job #2022477)

Utilizator dan.ghitaDan Ghita dan.ghita Data 16 septembrie 2017 16:53:35
Problema Arbori de intervale Scor 100
Compilator java Status done
Runda Arhiva educationala Marime 2.82 kb
import java.io.*;
import java.util.Objects;

public class Main {
    private static final int NMAX = 100005;
    private static int[] segmentTree = new int[4 * NMAX];
    private static int n, q;

    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[] tokens = reader.readLine().split(" ");
        n = Integer.parseInt(tokens[0]);
        q = Integer.parseInt(tokens[1]);

        tokens = reader.readLine().split(" ");
        for(int i = 1; i <= n; ++i) Update(i, Integer.parseInt(tokens[i - 1]));

        while(q-- > 0) {
            tokens = reader.readLine().split(" ");

            if (tokens[0].equals("0"))
                writer.write(String.valueOf(Query(Integer.parseInt(tokens[1]), Integer.parseInt(tokens[2]))) + "\n");
            else
                Update(Integer.parseInt(tokens[1]), Integer.parseInt(tokens[2]));
        }

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

    private static void Update(int indexToUpdate, int newValue) {
        Update(indexToUpdate, newValue, 1, n, 1);
    }

    private static void Update(int indexToUpdate, int newValue, int left, int right, int currentIndex) {
        if(left == right) {
            segmentTree[currentIndex] = newValue;
        } else {
            int middle = (left + right) >> 1;

            if (indexToUpdate <= middle)
                Update(indexToUpdate, newValue, left, middle, currentIndex << 1);
            else
                Update(indexToUpdate, newValue, middle + 1, right, (currentIndex << 1) + 1);

            segmentTree[currentIndex] = Math.max(segmentTree[currentIndex << 1], segmentTree[(currentIndex << 1) + 1]);
        }
    }

    private static int Query(int leftQuery, int rightQuery) {
        return Query(leftQuery, rightQuery, 1, n, 1);
    }

    private static int Query(int leftQuery, int rightQuery, int left, int right, int currentIndex) {
        // [(      )]
        if(leftQuery <= left && right <= rightQuery) {
            return segmentTree[currentIndex];
        } else {
            int middle = (left + right) >> 1;
            // [ ( | ) ]
            if(leftQuery <= middle && middle < rightQuery)
                return Math.max(
                    Query(leftQuery, middle, left, middle, currentIndex << 1),
                    Query(middle + 1, rightQuery, middle + 1, right, (currentIndex << 1) + 1));
            else
                // [ ( ) |     ]
                if(rightQuery <= middle)
                    return  Query(leftQuery, rightQuery, left, middle, currentIndex << 1);
                // [     | ( ) ]
                else
                    return Query(leftQuery, rightQuery, middle + 1, right, (currentIndex << 1) + 1);
        }
    }
}