Cod sursa(job #3267730)

Utilizator lucky1992Ion Ion lucky1992 Data 12 ianuarie 2025 10:34:41
Problema Arbori de intervale Scor 40
Compilator java Status done
Runda Arhiva educationala Marime 2.46 kb
import java.io.*;
import java.util.StringTokenizer;

public class Main {

  private static int[] tree;

  public static void build(int node, int left, int right, StringTokenizer stringTokenizer) {
    if (left == right) {
      tree[node] = Integer.parseInt(stringTokenizer.nextToken());
      return;
    }

    int mid = (left + right) >>> 1;
    build(2*node, left, mid, stringTokenizer);
    build(2*node+1, mid+1, right, stringTokenizer);
    tree[node] = Math.max(tree[2*node], tree[2*node+1]);
  }

  public static void update(int node, int left, int right, int pos, int val) {
    if (left == right) {
      tree[node] = val;
      return;
    }

    int mid = (left + right) >>> 1;
    if (pos <= mid) {
      update(2*node, left , mid, pos, val);
    } else {
      update(2*node+1, mid+1, right, pos, val);
    }
    tree[node] = Math.max(tree[2*node], tree[2*node+1]);
  }

  public static int query(int node, int left, int right, int a, int b) {
    if (a <= left && right <= b) {
      return tree[node];
    }

    int mid = (left + right) >>> 1;
    int leftMax = a <= mid ? query(2 * node, left, mid, a, b) : Integer.MIN_VALUE;
    int rightMax = mid < b ? query(2 * node + 1, mid+1, right, a, b) : Integer.MIN_VALUE;
    return Math.max(leftMax, rightMax);
  }


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

    // new Scanner(new BufferedInputStream(new FileInputStream("arbint.in"))
    try ( BufferedReader reader = new BufferedReader(new FileReader("arbint.in"), 65536);
          BufferedWriter writer = new BufferedWriter(new FileWriter("arbint.out"))) {
      String[] tokens = reader.readLine().split(" ");
      int N = Integer.parseInt(tokens[0]);
      int M = Integer.parseInt(tokens[1]);

      int closestPowerOfTwo = 1;
      while (closestPowerOfTwo < N) {
        closestPowerOfTwo *= 2;
      }

      tree = new int[2*closestPowerOfTwo+1];
      StringTokenizer stringTokenizer = new StringTokenizer(reader.readLine());
      build(1, 1, N, stringTokenizer);

      for (int i = 1; i <= M; i++) {
        tokens = reader.readLine().split(" ");
        int op = Integer.parseInt(tokens[0]);
        switch (op) {
          case 0:
            writer.write(query(1, 1, N, Integer.parseInt(tokens[1]), Integer.parseInt(tokens[2])) + "\n");
            break;
          case 1:
            int poz = Integer.parseInt(tokens[1]);
            int val = Integer.parseInt(tokens[2]);
            update(1, 1, N, poz, val);
            break;
        }
      }
    }
  }
}