Cod sursa(job #2565476)

Utilizator AplayLazar Laurentiu Aplay Data 2 martie 2020 14:19:02
Problema Arbori de intervale Scor 30
Compilator java Status done
Runda Arhiva educationala Marime 4.12 kb
import java.io.File;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

public final class Main {

    private static final int NO_ENTRY = -1;

    public final static void main(final String[] args) throws IOException {
        final BufferedReader in = new BufferedReader(new FileReader("arbint.in"));
        final BufferedWriter out = new BufferedWriter(new FileWriter("arbint.out"));

        final int[] nq = parseLine(in.readLine());
        final int N = nq[0];
        final int Q = nq[1];

        final int[] tree = new int[5 * N - 1];
        for (int it = 0; it < tree.length; ++it) {
            tree[it] = NO_ENTRY;
        }
        
        final int[] values = parseLine(in.readLine());
        for (int it = 0; it < N; ++it) {
            insertValue(values[it], it, it, tree, 0, 0, N - 1);
        }

        //printTree(tree);

        for (int it = 0; it < Q; ++it) {
            final int[] q = parseLine(in.readLine());
            final int qType = q[0];
            final int a = q[1];
            final int b = q[2];
            if (0 == qType) {
                final int qResult = max(a - 1, b - 1, tree, 0, 0, N - 1);
                out.write(qResult + "\n");
            } else {
                insertValue(b, a - 1, a - 1, tree, 0, 0, N - 1);
                //printTree(tree);
            }
        }

        in.close();

        out.flush();
        out.close();
    }

    private static final void printTree(final int[] tree) {
        for (int it = 0; it < tree.length; ++it) {
            System.out.print(tree[it] + " ");
        }
        System.out.println();
    }

    private static final void insertValue(final int value, final int vStart, final int vEnd, final int[] tree, final int tCurrent, final int tStart, final int tEnd) {
        if (vStart <= tStart && tEnd <= vEnd) {
            //System.out.println("Write [" + tCurrent + "]: " + value);
            tree[tCurrent] = value;
            return;
        }

        final int middle = tStart + (tEnd - tStart) / 2;
        if (vStart <= middle && left(tCurrent) < tree.length) {
            //System.out.println(vStart + ", " + vEnd + ": " + left(tCurrent));
            insertValue(value, vStart, vEnd, tree, left(tCurrent), tStart, middle);
        }
        if (middle < vEnd && right(tCurrent) < tree.length) {
            insertValue(value, vStart, vEnd, tree, right(tCurrent), 1 + middle, tEnd);
        }
        //tree[tCurrent] = NO_ENTRY;
        //if (left(tCurrent) < tree.length) {
            
            tree[tCurrent] = tree[left(tCurrent)];
        //}
        //if (right(tCurrent) < tree.length) {
            tree[tCurrent] = Math.max(tree[tCurrent], tree[right(tCurrent)]);   
        //}
    }

    private static final int left(final int of) {
        return 1 + 2 * of;
    }

    private static final int right(final int of) {
        return 2 + 2 * of;
    }
    
    private static final int max(final int iStart, final int iEnd, final int[] tree, final int tCurrent, final int tStart, final int tEnd) {
        if (iStart <= tStart && tEnd <= iEnd) {
            //System.out.println("Return for (" + iStart + ", " + iEnd + "): " + tree[tCurrent]);
            return tree[tCurrent];
        }

        int leftMax = NO_ENTRY, rightMax = NO_ENTRY;
        final int middle = tStart + (tEnd - tStart) / 2;
        if (iStart <= middle && left(tCurrent) < tree.length) {
            //System.out.println("Goint left for (" + iStart + ", " + middle + ")");
            leftMax = max(iStart, iEnd, tree, left(tCurrent), tStart, middle);
        }
        if (middle < iEnd && right(tCurrent) < tree.length) {
            //System.out.println("Goint left for (" + 1 + middle + ", " + tEnd + ")");
            rightMax = max(iStart, iEnd, tree, right(tCurrent), 1 + middle, tEnd);
        }
        return Math.max(leftMax, rightMax);
    }

	public static int[] parseLine(String line) {
		String[] elements = line.split(" ");
		int[] result = new int[elements.length];
 
		for (int it = 0; it < elements.length; ++it) {
			result[it] = Integer.parseInt(elements[it]);
		}
 
		return result;
	}

}