Cod sursa(job #1507744)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 21 octombrie 2015 21:08:38
Problema Arbori de intervale Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 1.79 kb
import java.io.*;
import java.util.Scanner;
public class arbint {
	static final int NMAX = 100002;
	static int []a = new int[NMAX];
	public static class SegmentTree
	{
		private static int []aint = new int[4*NMAX];
		public static void Build(int node,int Left,int Right)
		{
			if(Left == Right)
			{
				aint[node] = a[Left];
				return;
			}
			int mid = (Left+Right)/2;
			Build(2*node,Left,mid);
			Build(2*node+1,mid+1,Right);
			aint[node] = (aint[2*node]>=aint[2*node+1]?aint[2*node]:aint[2*node+1]);
		}
		public static void Update(int node,int Left,int Right,int pos,int val)
		{
			if(Left == Right)
			{
				aint[node] = val;
				return;
			}
			int mid = (Left+Right)/2;
			if(pos <= mid)
				Update(2*node,Left,mid,pos,val);
			else
				Update(2*node+1,mid+1,Right,pos,val);
			aint[node] = (aint[2*node]>=aint[2*node+1]?aint[2*node]:aint[2*node+1]);
		}
		public static int Query(int node,int Left,int Right,int A,int B)
		{
			if(A <= Left && Right <= B)
				return aint[node];
			int mid = (Left+Right)/2,x = 0, y = 0;
			if(A <= mid)
				x = Query(2*node,Left,mid,A,B);
			if(mid < B)
				y = Query(2*node+1,mid+1,Right,A,B);
			return (x >= y? x : y );
		}
	}
	static SegmentTree T;
	public static void main(String []args) throws IOException
	{
		Scanner in = new Scanner(new FileInputStream("arbint.in"));
		PrintWriter out = new PrintWriter("arbint.out");
		int n = in.nextInt(), operation, x, y;
		int m = in.nextInt();
		for(int i=1;i<=n;++i)
			a[i] = in.nextInt();
		T.Build(1,1,n);
		while(m--  > 0)
		{
			operation = in.nextInt();
			x = in.nextInt();
			y = in.nextInt();
			if(operation == 0)
				out.print(String.valueOf(T.Query(1, 1, n, x, y))+"\n");
			else
				T.Update(1, 1, n, x, y);
		}
		in.close();
		out.close();
	}
	
}