Pagini recente » Cod sursa (job #2467628) | Cod sursa (job #1990516) | Cod sursa (job #567627) | Cod sursa (job #928265) | Cod sursa (job #2250729)
#include <bits/stdc++.h>
using namespace std;
long long values[100001], arb[100001];
long long mub(long long n){
return (n & (-n));
// returns 2^(mub(i))
}
long long query (long long i){
if (i == 0) {
return 0;
}
else{
return arb[i] + query(i- mub(i));
}
}
long long binarySearch(long long x, long long n){
long long position = 0;
for (long long power = 20; power >= 0 ; power --){
if (position + (1 << power) <= n && (arb[position + (1 << power)] < x or (arb[position + (1 << power)] == x and (power == 0 or arb[position + ((1 << power) - 1)] != x)))){
position += (1 << power);
x -= arb[position];
}
}
if ( x == 0){
return position;
}
else{
return -1;
}
}
void update(long long position, long long n, long long value){
while(position <= n){
arb[position] += value;
position += mub(position);
}
}
long long main() {
ifstream f ("aib.in");
ofstream g ("aib.out");
long long n, m;
f >> n >> m;
for (long long i = 1; i <= n; i++){
f >> values[i];
update(i, n, values[i]);
}
for (long long i = 1; i <= m; i ++){
long long op;
f >> op;
if (op == 0){
long long a, b;
f >> a >> b;
update(a, n, b);
}
if (op == 1){
long long a, b;
f >> a >> b;
long long sum = 0;
sum = query(b) - query(a - 1);
g << sum << "\n";
}
if (op == 2){
long long a, k = 0;
f >> a;
k = binarySearch(a, n);
g << k << "\n";
}
}
return 0;
}