Cod sursa(job #2263035)

Utilizator Codrin09Sirboiu Codrin Codrin09 Data 18 octombrie 2018 01:10:43
Problema Arbori de intervale Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 3.23 kb
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Map;
import java.util.Iterator;
import java.io.File;
import java.io.PrintWriter;

public class Main{

  public static void printer(Tree t){
    System.out.print(t.val + " ");
    if(t.left != null)
      printer(t.left);
    if(t.right != null)
      printer(t.right);
  }

  public static boolean overlaps(int s, int d, int x, int y){
    if(x >= s && x <= d)
      return true;
    if(y >= s && y <= d)
      return true;
    return false;
  }

  public static boolean includes(int s, int d, int x, int y){
    if(s >= x && d <=y)
      return true;
    return false;
  }

  public static int search(Tree t, int s, int d, int x, int y){
    //System.out.println(s + " " + d + " " + x + " " + y);
    if(includes(s,d,x,y))
      return t.val;
    int m = (s+d)/2;
    int result = Integer.MIN_VALUE;
    if(overlaps(s,m,x,y))
      result = Math.max(result, search(t.left, s,m,x,y));
    if(overlaps(m + 1, d,x,y))
      result = Math.max(result, search(t.right,m+1,d,x,y));

    return result;
  }

  private static void insert(Tree t, int s, int d, int num, int poz){
    //System.out.println(s + " " + d + " " + num + " " + poz);
    if(s == d){
      //System.out.println(s + " " + poz);
      t.val = num;
      return;
    }
    int m = (s + d)/2;
    if(poz >= s && poz <= m){
      insert(t.left, s,m, num, poz);
    }
    if(poz >= m+1 && poz <= d)
      insert(t.right, m + 1, d, num, poz);

    if(t.left != null){
      if(t.right != null)
        t.val = Math.max(t.left.val, t.right.val);
      else
        t.val = t.left.val;
    }
    else{
      if(t.right!= null)
        t.val = t.right.val;
    }
  }

  public static void main(String[] args) throws Exception{
    //Scanner scanner = new Scanner(System.in);

    File file = new File("arbint.in");
    Scanner scanner = new Scanner(file);
    PrintWriter writer = new PrintWriter("arbint.out", "UTF-8");

    Tree root = new Tree();
    int n = Integer.parseInt(scanner.next());
    int nn = Integer.parseInt(scanner.next());
    for(int i = 0; i < n; i++){
      int num = Integer.parseInt(scanner.next());
      Tree it = root;
      int s,d;
      s = 0;
      d = n - 1;
      int m;
      while( s!=d ){
        m = (s + d) / 2;
        if(num > it.val)
          it.val = num;
        if(i <= m){
          if(it.left == null)
            it.left = new Tree();
          it = it.left;
          d = m;
        }
        else{
          if(it.right == null)
            it.right = new Tree();
          it = it.right;
          s = m + 1;
        }
        if(d == s)
          it.val = num;
      }
    }

    for(int i = 0; i < nn;i++){
      //printer(root);
      int op = Integer.parseInt(scanner.next());
      int s = Integer.parseInt(scanner.next());
      int d = Integer.parseInt(scanner.next());
      if(op == 0){
        //System.out.println("Result: " + search(root, 0, n - 1, s - 1, d - 1));
        writer.println(search(root, 0, n - 1, s - 1, d - 1));
      }
      else
        insert(root, 0, n-1, d, s - 1);

    }
    writer.close();


    //System.out.println("GUCCI " + search(root, 0, n - 1, 1, 5));
  }
}

class Tree{
  Tree left, right;
  int val;
  public Tree(){
    val = -1 * Integer.MIN_VALUE;
  }
}