Pagini recente » Cod sursa (job #2998878) | Cod sursa (job #314180) | Cod sursa (job #2928929) | Cod sursa (job #44601) | Cod sursa (job #3149298)
#include <iostream>
using namespace std;
int lung(int x) {
return ( ( x ^ (x - 1) ) & x)
}
int N, M;
int aib[100100];
void update (int poz, int val) {
for (int i = poz; i <= N; i += lung(i))
aib[i] += val;
}
int query(int poz) {
int s = 0;
for (int i = poz; i >= 1; i -= lung(i))
s += aib[i];
return s;
}
int search(int a) {
int mid, st = 1, dr = N, sol = -1;
while (st <= dr) {
mid = (st + dr) / 2;
if (query(mid) == a) {
sol = mid;
dr = mid - 1;
}
else if (query(mid) > a)
dr = mid - 1;
else
st = mid + 1;
}
return sol;
}
int main() {
cin >> N >> M;
int x;
for (int i = 1; i <= N; i++) {
cin >> x;
update(i, x);
}
int q, a, b;
for (int i = 1; i <= M; i++) {
cin >> q;
if (q == 1) {
cin >> a >> b;
update(a, b);
}
if (q == 2) {
cin >> a >> b;
cout << query(b) - query(a) - 1 << '\n';
}
if (q == 3) {
cin >> a;
cout << search(a) << '\n';
}
}
return 0;
}