Cod sursa(job #2055533)

Utilizator alexnekiNechifor Alexandru alexneki Data 3 noiembrie 2017 13:18:24
Problema Arbori de intervale Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 1.96 kb

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class Main {

  static int n;
  static int np = 2;
  static int m;
  static int v[];
  static int arb[];

  public static void update(int i) {
    if(0 < i) {
      arb[i] = Math.max(arb[2*i], arb[2*i + 1]);
      update(i / 2);
    } 
  }
  
  public static int query(int from, int to) {
    int answer = 0;
    
    if(from == to)
      answer = arb[from];
    else if(from < to) {
      if(from % 2 == 1) {
        answer = Math.max(answer, arb[from]);        
        from++;
      } if(to % 2 == 0) {
        answer = Math.max(answer, arb[to]);
        to--;
      }
      return Math.max(answer, query(from / 2, to / 2));
    }
    
    return answer;
  }
  
  public static void main(String[] args) throws FileNotFoundException, IOException {
    Scanner in = new Scanner(new BufferedReader(new FileReader("arbint.in")));
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("arbint.out")));

    n = in.nextInt();
    m = in.nextInt();

    int pow = 0;
    while ((1 << pow) < n) {
      pow++;
    }
    np = (1 << pow);

    v = new int[n + 1];
    for (int i = 1; i <= n; i++) {
      v[i] = in.nextInt();
      //out.write(v[i] + " ");
    }

    arb = new int[2 * np + 2];
    for (int i = 0; i < n; i++) {
      arb[np + i] = v[i];
    }
    for (int i = np; i > 0; i--) {
      arb[i] = Integer.max(arb[2 * i], arb[2 * i + 1]);
    }

    for (int i = 0; i < m; i++) {
      int op = in.nextInt();
      int x = in.nextInt();
      int y = in.nextInt();
      if(op == 0) {
        out.println(query(np + x, np + y));
      } else if(op == 1) {
        arb[np + x] = y;
        update((np + x) / 2);
      }
    }

    out.close();
  }

}