Pagini recente » Tudor Maxim | Cod sursa (job #2005082) | Cod sursa (job #126945) | Monitorul de evaluare | Cod sursa (job #2091246)
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;
}
}
}