Cod sursa(job #2639226)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 31 iulie 2020 23:57:43
Problema Arbori de intervale Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 1.71 kb
//package ia;
import java.io.FileWriter;
import java.io.File;
import java.util.Scanner;
import java.io.IOException;

public class Main {
	public static void main(String[] args) {
		try{
			FileWriter fo = new FileWriter("arbint.out");
			File f = new File("arbint.in");
			Scanner fi = new Scanner(f);
			
			int n = fi.nextInt();
			int m = fi.nextInt();
			
			Segment_Tree tree = new Segment_Tree(n);
			
			/*for(int i = 1; i <= n; i++) {
				int x = fi.nextInt();
				tree.Update(i, x);
			}
			for(int i = 1; i <= m; i++) {
				if(fi.nextInt() == 0)
					fo.write(tree.Query(fi.nextInt(), fi.nextInt()) + "\n");
				else
					tree.Update(fi.nextInt(), fi.nextInt());
			}*/
			
			fo.close();
			fi.close();
		}
		catch(IOException e) {}
	}
}

class Segment_Tree{
	private int size;
	int[] aint;
	public Segment_Tree(int _size){
		size = _size;
		aint = new int[1 + 4 * size];
	}
	
	private int pos, val;
	private void update(int p, int st, int dr) {
		if(st == dr)
			aint[p] = val;
		else {
			int m = (st + dr) / 2;
			if(pos <= m) update(2 * p, st, m);
			else update(2 * p + 1, m + 1, dr);
			
			aint[p] = Math.max(aint[2 * p], aint[2 * p + 1]);
		}
	}
	
	private int left, right, ans;
	private void query(int p, int st, int dr) {
		if(left <= st && dr <= right)
			ans = Math.max(ans,  aint[p]);
		else {
			int m = (st + dr) / 2;
			if(left <= m) query(2 * p, st, m);
			if(m + 1 <= right) query(2 * p + 1, m + 1, dr);
		}
	}
	
	public void Update(int _pos, int _val) {
		pos = _pos;
		val = _val;
		update(1, 1, size);
	}
	public int Query(int _left, int _right) {
		left = _left;
		right = _right;
		ans = 0;
		
		query(1, 1, size);
		return ans;
	}
}