Pagini recente » Cod sursa (job #2805906) | Cod sursa (job #295291) | Cod sursa (job #11443) | Cod sursa (job #2817042) | Cod sursa (job #1866800)
#include <cstdio>
using namespace std;
int aib[100005], n;
int zeros(int x) {
return x & -x;
}
int add(int poz, int x) {
for(int i = poz; i <= n; i += zeros(i)) {
aib[i] += x;
}
}
int compute(int poz) {
int sum = 0;
for(int i = poz; i >= 1; i -= zeros(i)) {
sum += aib[i];
}
return sum;
}
int cautbin(int val, int st, int dr) {
int med, aux, last = -1;
while(st <= dr) {
med = (st + dr) / 2;
aux = compute(med);
if(aux == val) {
last = med;
dr = med - 1;
} else
if(aux < val) {
st = med + 1;
} else {
dr = med - 1;
}
}
return last;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int m, x, y, tip;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++ i) {
scanf("%d", &x);
add(i, x);
}
for(int i = 1; i <= m; ++ i) {
scanf("%d", &tip);
scanf("%d", &x);
if(tip == 0) {
scanf("%d", &y);
add(x, y);
}
if(tip == 1) {
scanf("%d", &y);
printf("%d\n", compute(y) - compute(x - 1));
}
if(tip == 2) {
printf("%d\n", cautbin(x, 1, n));
}
}
return 0;
}