Pagini recente » Cod sursa (job #221645) | Cod sursa (job #1509868) | Monitorul de evaluare | Cod sursa (job #2295237) | Cod sursa (job #1213634)
#include<cstdio>
using namespace std;
int aib[200001];
void update(int pos, int val, int n) {
while(pos <= n) {
aib[pos] += val;
pos += pos & -pos;
}
}
int query(int pos) {
int sum = 0;
while(pos > 0) {
sum += aib[pos];
pos -= pos & -pos;
}
return sum;
}
int binarySearch(int sum, int n) {
int poz = 1, pas, current = 0, ans = -1;
while(poz <= n) poz *= 2;
poz /= 2;
pas = poz;
while(pas > 0) {
pas /= 2;
if(current + aib[poz] <= sum) {
if(poz + pas <= n) {
ans = poz;
current += aib[poz];
poz += pas;
}
} else {
poz -= pas;
}
}
if(current == sum) return ans;
return -1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int a, b, opt, n, m, i;
scanf("%d %d", &n, &m);
for(i = 1; i <= n; i++) {
scanf("%d", &a);
update(i, a, n);
}
for(i = 0; i < m; i++) {
scanf("%d", &opt);
if(opt == 0) {
scanf("%d %d", &a, &b);
update(a, b, n);
}
if(opt == 1) {
scanf("%d %d", &a, &b);
printf("%d\n", query(b) - query(a-1));
}
if(opt == 2) {
scanf("%d", &a);
printf("%d\n", binarySearch(a, n));
}
}
return 0;
}