Pagini recente » Cod sursa (job #2310210) | Cod sursa (job #2107503) | Cod sursa (job #2508619) | Cod sursa (job #627721) | Cod sursa (job #998571)
Cod sursa(job #998571)
#include <cstdio>
using namespace std;
int n, aib[100005];
inline int lsb(int &x){
return x & -x;
}
void update(int pos, int val){
while(pos <= n){
aib[pos] += val;
pos += lsb(pos);
}
}
int q1(int pos){
int r_val = 0;
while(pos > 0){
r_val += aib[pos];
pos -= lsb(pos);
}
return r_val;
}
int l, r, mid, last, t_sol;
int q2(int sum){
l = 1;
r = n;
last = -1;
while(l <= r){
mid = (l + r) >> 1;
t_sol = q1(mid);
if(t_sol > sum)
r = mid - 1;
else if(t_sol < sum)
l = mid + 1;
else{
r = mid - 1;
last = mid;
}
}
return last;
}
int main(){
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
int x;
scanf("%d", &x);
update(i, x);
}
for(int i = 1; i <= m; ++i){
int tip;
scanf("%d", &tip);
if(tip == 0){
int x, y;
scanf("%d%d", &x, &y);
update(x, y);
}
else if(tip == 1){
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", q1(y) - q1(x - 1));
}
else{
int x;
scanf("%d", &x);
printf("%d\n", q2(x));
}
}
return 0;
}