Cod sursa(job #1778656)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 13 octombrie 2016 22:53:36
Problema Arbori de intervale Scor 50
Compilator java Status done
Runda Arhiva educationala Marime 2.28 kb
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws IOException{
	    String in_file_name = "arbint.in";
        String out_file_name = "arbint.out";

        FileReader in_file = new FileReader(in_file_name);
        FileWriter out_file = new FileWriter(out_file_name);

        Scanner in = new Scanner(in_file);
        PrintWriter out = new PrintWriter(out_file);

        int M, N;
        int a, b, c;
        N = in.nextInt();
        M = in.nextInt();

        SegmentTree Tree = new SegmentTree(N);

        for (int i = 1; i <= N; i++) {
            a = in.nextInt();
            Tree.update(i, a);
        }

        for (int i = 0; i < M; i++) {
            a = in.nextInt();
            b = in.nextInt();
            c = in.nextInt();

            if (a == 0) {
                out.write(Tree.query(b, c) + "\n");
            } else {
                Tree.update(b, c);
            }
        }

        in.close();
        out.close();
    }
}

class SegmentTree {
    private final static int MAXN = 100010;

    private int[] A = new int[MAXN * 4];
    private final int N;

    SegmentTree(int N) {
        this.N = N;
    }

    void update(int pos, int val) {
        update(1, 1, N, pos, val);
    }

    void update(int nod, int st, int dr, int pos, int val) {
        if (st == dr) {
            A[nod] = val;
        } else {
            int mid = (st + dr) / 2;

            if (pos <= mid) {
                update(nod * 2, st, mid, pos, val);
            } else {
                update(nod * 2 + 1, mid + 1, dr, pos, val);
            }

            A[nod] = Math.max(A[nod * 2], A[nod * 2 + 1]);
        }
    }

    int query(int st, int dr) {
       return query(1, 1, N, st, dr);
    }

    int query(int nod, int st, int dr, int a, int b) {
        if (a <= st && dr <= b) {
            return A[nod];
        } else {
            int mid = (st + dr) / 2;

            int val1 = 0, val2 = 0;
            if (a <= mid) {
                val1 = query(nod * 2, st, mid, a, b);
            }
            if (mid < b) {
                val2 = query(nod * 2 + 1, mid + 1, dr, a, b);
            }

            return Math.max(val1, val2);
        }
    }
}