Cod sursa(job #2091246)

Utilizator abitlazyabitlazy abitlazy Data 19 decembrie 2017 13:09:39
Problema Arbori indexati binar Scor 20
Compilator java Status done
Runda Arhiva educationala Marime 2 kb
import java.io.*;
import java.util.*;

public class Main {
	private static final String INPUT_FILE_PATH = "aib.in";
	private static final String OUTPUT_FILE_PATH = "aib.out";

	public static void main(String[] args) throws IOException {
		Scanner in = new Scanner(new FileReader(INPUT_FILE_PATH));
		PrintWriter out = new PrintWriter(OUTPUT_FILE_PATH);
		int n = in.nextInt();
		int q = in.nextInt();
		FenwickTree mTree = new FenwickTree(n);
		for (int i = 1; i <= n; ++i) {
			int val = in.nextInt();
			mTree.update(i, val);
		}
		while (q-- > 0) {
			int op = in.nextInt();
			switch (op) {
			case 0:
				int ind = in.nextInt();
				int newVal = in.nextInt();
				mTree.update(ind, newVal);
				break;
			case 1:
				int l = in.nextInt();
				int r = in.nextInt();
				out.println(mTree.rangeSumQuery(l, r));
				break;
			case 2:
				int val = in.nextInt();
				out.println(mTree.lowerBound(val));
				break;
			}
		}
		in.close();
		out.close();
	}

	static class FenwickTree {
		int[] array;

		public FenwickTree(int size) {
			array = new int[size + 1];
		}

		private int lastSignificantBit(int n) {
			return n - (n & (n - 1));
		}

		public int rangeSumQuery(int ind) {
			int sum;
			for (sum = 0; ind > 0; ind -= lastSignificantBit(ind)) {
				sum += array[ind];
			}
			return sum;
		}

		public int rangeSumQuery(int a, int b) {
			return rangeSumQuery(b) - rangeSumQuery(a - 1);
		}

		public void update(int ind, int value) {
			for (; ind <= size(); ind += lastSignificantBit(ind)) {
				array[ind] += value;
			}
		}

		public int lowerBound(int val) {
			int l = 1;
			int r = size();
			while (r - l > 1) {
				int mid = (l + r) / 2;
				int sum = rangeSumQuery(mid);
				if (sum >= val) {
					r = mid;
				} else {
					l = mid;
				}
			}
			if (rangeSumQuery(l) == val) {
				return l;
			}
			if (rangeSumQuery(r) == val) {
				return r;
			}
			return -1;
		}

		public int size() {
			return array.length - 1;
		}
	}

}