Pagini recente » Istoria paginii utilizator/cazacu_elian | Cod sursa (job #2829854) | Cod sursa (job #1411240) | Cod sursa (job #3295964) | Cod sursa (job #2018429)
#include <cstdio>
using namespace std;
const int MAX_N = 100000;
int aib[MAX_N + 5];
int lastBit(int x) {
return x & -x;
}
void update(int poz, int val, int n) {
for (; poz <= n; poz += lastBit(poz))
aib[poz] += val;
}
int query(int poz) {
int ans = 0;
for (; poz; poz -= lastBit(poz))
ans += aib[poz];
return ans;
}
int bs(int st, int dr, int val) {
int last = 0;
while (st <= dr) {
int med = (st + dr) / 2;
if (query(med) < val) {
last = med;
st = med + 1;
} else {
dr = med - 1;
}
}
if (query(last + 1) == val)
return last + 1;
return -1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
int x;
scanf("%d", &x);
update(i, x, n);
}
for (int i = 1; i <= m; ++i) {
int tip;
scanf("%d", &tip);
if (tip == 0) {
int a, b;
scanf("%d%d", &a, &b);
update(a, b, n);
} else if (tip == 1) {
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", query(b) - query(a - 1));
} else {
int a;
scanf("%d", &a);
printf("%d\n", bs(1, n, a));
}
}
return 0;
}