Pagini recente » Cod sursa (job #1975537) | Cod sursa (job #2616490) | Cod sursa (job #2181894) | Cod sursa (job #936688) | Cod sursa (job #2182742)
#include <cstdio>
using namespace std;
long long aib[100005] , sp[100005];
int n;
void update(int poz , int val) {
for( ; poz <= n ; poz = poz + (poz&-poz))
aib[poz] += val;
}
long long query(int poz) {
long long s = 0;
for( ; poz > 0 ; poz = poz - (poz&-poz))
s = s + aib[poz];
return s;
}
int bs(int n , int a) {
int st , dr , med;
st = 1;
dr = n;
while(st <= dr) {
med = (st + dr) / 2;
if(query(med) == a)
return med;
else if(query(med) > a)
dr = med - 1;
else
st = med + 1;
}
return -1;
}
int main() {
freopen("aib.in" , "r" , stdin);
freopen("aib.out" , "w" , stdout);
int m , a , b , i , op , poz , x;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++) {
scanf("%d" , &x);
sp[i] = sp[i - 1] + x;
}
for(i = 1 ; i <= n ; i ++)
aib[i] = sp[i] - sp[i - (i&-i)];
for(i = 1 ; i <= m ; i ++) {
scanf("%d" , &op);
if(op == 0) {
scanf("%d%d" , &a , &b);
update(a , b);
} else if(op == 1) {
scanf("%d%d" , &a , &b);
printf("%lld\n" , query(b) - query(a - 1));
} else if(op == 2) {
scanf("%d" , &a);
poz = bs(n , a);
printf("%d\n" , poz);
}
}
return 0;
}