Pagini recente » Cod sursa (job #885572) | Cod sursa (job #2374708) | Cod sursa (job #1482051) | Cod sursa (job #1276824) | Cod sursa (job #2231008)
#include <fstream>
#include <vector>
#include <stdio.h>
using namespace std;
typedef long long ll;
ll lsb(ll a) {
return a & (-a);
}
void update(vector<ll> &vec, int pos, int value) {
while (pos <= vec.size()) {
vec[pos - 1] += value;
pos += lsb(pos);
}
}
ll query(vector<ll> &vec, ll pos) {
ll res = 0;
while (pos != 0) {
res += vec[pos-1];
pos -= lsb(pos);
}
return res;
}
ll search(vector<ll> &vec, ll value) {
int start, end;
start = 0;
end = vec.size() - 1;
while (start <= end) {
int mid = start + (end - start) / 2 + 1;
ll x = query(vec, mid);
if (x == value) {
return mid;
} else if (x < value) {
start = mid;
} else {
end = mid - 2;
}
}
return -1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int n, m;
scanf("%d", &n);
scanf("%d", &m);
vector<ll> aib(n, 0);
int x;
for (int i = 0; i < n; ++i) {
scanf("%d", &x);
update(aib, i+1, x);
}
int type, a, b;
for (int i = 0; i< m; ++i) {
scanf("%d", &type);
if (type == 0) {
scanf("%d %d", &a, &b);
update(aib, a, b);
} else if (type == 1) {
scanf("%d %d", &a, &b);
ll sum_til_a = 0;
if (a > 0)
sum_til_a = query(aib, a-1);
ll sum_til_b = query(aib, b);
printf("%lld\n", sum_til_b - sum_til_a);
} else {
scanf("%d", &a);
printf("%lld\n", search(aib, a));
}
}
}