Cod sursa(job #1734729)

Utilizator xtreme77Patrick Sava xtreme77 Data 28 iulie 2016 00:45:38
Problema Arbori de intervale Scor 100
Compilator java Status done
Runda Arhiva educationala Marime 4.42 kb
  
import java.util.*;
import java.io.*;
  
/***
* 
* @author Patrick
*
*/
  
public class Main {
    public static int [ ] arb = new int [ 700999 ] ;
    public static void main(String[] args) throws FileNotFoundException, IOException {
      //Reader Goo = new Reader () ;
     // Reader.init(new FileInputStream ( "arbint.in" ) ); 
    	InputReader cin=new InputReader (new FileInputStream ( "arbint.in") );
    	OutputWriter out=new OutputWriter(new FileOutputStream ( "arbint.out"));
      int N = cin.readInt() ;
      int M = cin.readInt() ; 
      for ( int i = 1 ; i <= N ; ++ i ) {
          int X = cin.readInt() ; 
          update ( 1 , 1 , N , i , X ) ;
      }
      for ( int i = 1 ; i <= M ; ++ i ) {
        int Tip = cin.readInt() ; 
        if ( Tip == 1 ) {
            int X = cin.readInt() ;  
            int Y = cin.readInt() ; 
            update ( 1 , 1 , N , X , Y ) ;
        }
        else {
            int X = cin.readInt() ;  
            int Y = cin.readInt() ; 
            out.print( query ( 1 , 1 , N , X , Y ) );
            out.print( "\n" );
        }
      }
      out.close ( ) ;
        
    }
    public static int query ( int nod , int st , int dr , int a , int b )
    {
        //System.out.println( "a intrat" );
        //System.out.println( nod );
        if ( a <= st && dr <= b ) {
            //sol = Math.max( sol , arb [ nod ] ) ;
            return arb [ nod ] ;
        }
        int mij = ( st + dr ) / 2 ; 
        int LEFT = 0 ; 
        int RIGHT = 0 ;
        if ( a <= mij ) {
            LEFT = query ( nod * 2 , st , mij , a , b ) ;
        }
        if ( b > mij ) {
            RIGHT = query ( nod * 2 + 1 , mij + 1 , dr , a , b ) ;
        }
        return Math.max( LEFT ,  RIGHT ) ;
    }
    public static void update ( int nod , int st , int dr , int pos , int val )
    {
        if ( st == dr ) {
            arb [ nod ] = val ;
            return ; 
        }
        int mij = ( st + dr ) / 2 ;
        if ( pos <= mij ) {
            update ( nod * 2 , st , mij , pos , val ) ;
        }
        else {
            update ( nod * 2 + 1 , mij + 1 , dr , pos , val ) ;
        }
        arb [ nod ] = Math.max ( arb [ nod * 2 ] , arb [ nod * 2 + 1 ] ) ;
    }
    /** Class for buffered reading int and double values */
    
}
class InputReader {
	 
	private InputStream stream;
	private byte[] buf = new byte[1024];
	private int curChar;
	private int numChars;
	private SpaceCharFilter filter;

	public InputReader(InputStream stream) {
		this.stream = stream;
	}

	public int read() {
		if (numChars == -1)
			throw new InputMismatchException();
		if (curChar >= numChars) {
			curChar = 0;
			try {
				numChars = stream.read(buf);
			} catch (IOException e) {
				throw new InputMismatchException();
			}
			if (numChars <= 0)
				return -1;
		}
		return buf[curChar++];
	}

	public int readInt() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		int sgn = 1;
		if (c == '-') {
			sgn = -1;
			c = read();
		}
		int res = 0;
		do {
			if (c < '0' || c > '9')
				throw new InputMismatchException();
			res *= 10;
			res += c - '0';
			c = read();
		} while (!isSpaceChar(c));
		return res * sgn;
	}

	public String readString() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		StringBuilder res = new StringBuilder();
		do {
			res.appendCodePoint(c);
			c = read();
		} while (!isSpaceChar(c));
		return res.toString();
	}

	public boolean isSpaceChar(int c) {
		if (filter != null)
			return filter.isSpaceChar(c);
		return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
	}

	public String next() {
		return readString();
	}

	public interface SpaceCharFilter {
		public boolean isSpaceChar(int ch);
	}
}

class OutputWriter {
	private final PrintWriter writer;

	public OutputWriter(OutputStream outputStream) {
		writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
	}

	public OutputWriter(Writer writer) {
		this.writer = new PrintWriter(writer);
	}

	public void print(Object...objects) {
		for (int i = 0; i < objects.length; i++) {
			if (i != 0)
				writer.print(' ');
			writer.print(objects[i]);
		}
	}

	public void printLine(Object...objects) {
		print(objects);
		writer.println();
	}

	public void close() {
		writer.close();
	}

	public void flush() {
		writer.flush();
	}

	}