Cod sursa(job #1403670)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 27 martie 2015 15:02:49
Problema Arbori de intervale Scor 40
Compilator java Status done
Runda Arhiva educationala Marime 1.7 kb
import java.util.*;
import java.io.*;

public class Main {

	static int A[];
	static int v[];
	
	public static void main(String[] args) throws FileNotFoundException {
		
		Scanner reader = new Scanner(new FileInputStream("arbint.in"));
		PrintWriter writer = new PrintWriter("arbint.out");

		int N = reader.nextInt();
		int M = reader.nextInt();
		
		A = new int[4 * N];
		v = new int[N + 1];
		
		for (int i = 1; i <= N; ++i)
		{
			int key = reader.nextInt();
			v[i] = key;
		}
		
		build(1, 1, N);
		
		while (M-- > 0)
		{
			int tip, a, b;
			
			tip = reader.nextInt();
			a = reader.nextInt();
			b = reader.nextInt();
			
			if (tip == 1)
				update(1, 1, N, a, b);
			else
				writer.print(query(1, 1, N, a, b) + "\n");
		}
		
		reader.close();
		writer.close();
	}
	
	public static void build(int nod, int st, int dr)
	{
		if (st == dr)
			A[nod] = v[st];
		else
		{
			int m = (st + dr) >>> 1;
			
			build(2 * nod, st, m);
			build(2 * nod + 1, m + 1, dr);
			
			A[nod] = Math.max(A[2 * nod], A[2 * nod + 1]);
		}
	}
	
	public static void update(int nod, int st, int dr, int pos, int key)
	{
		if (st == dr)
		{
			A[nod] = key;
		}
		else
		{
			int m = (st + dr) >>> 1;
			
			if (pos <= m)
				update(2 * nod, st, m, pos, key);
			else
				update(2 * nod + 1, m + 1, dr, pos, key);
			
			A[nod] = Math.max(A[2 * nod], A[2 * nod + 1]);
		}
	}
	
	public static int query(int nod, int st, int dr, int st_q, int dr_q)
	{
		if (st_q <= st && dr <= dr_q)
			return A[nod];
		else
		{
			int m = (st + dr) >>> 1;
			int sol = -1;
			
			if (st_q <= m)
				sol = Math.max(sol, query(2 * nod, st, m, st_q, dr_q));
			
			if (m < dr_q)
				sol = Math.max(sol, query(2 * nod + 1, m + 1, dr, st_q, dr_q));
		
			return sol;
		}
	}
}