Pagini recente » Cod sursa (job #2359068) | Cod sursa (job #2638120) | Cod sursa (job #3135974) | Cod sursa (job #131542) | Cod sursa (job #711381)
Cod sursa(job #711381)
#include <cstdio>
#include <cassert>
using namespace std;
#define NMAX 100005
int C[NMAX], N, M, S[NMAX];
void add(int pos, int value){
int nr = 0;
C[pos] += value;
while(pos <= N){
while(!(pos & (1 << nr))) ++nr;
pos += (1 << nr);
C[pos] += value;
++nr;
}
}
int getSum(int lim){
int sum = 0, nr = 0;
while(lim > 0){
sum += C[lim];
while(!(lim & (1 << nr))) ++nr;
lim -= (1 << nr);
nr += 1;
}
return sum;
}
int getMinIndex(int sum){
int start = 1, end = N, mid;
while(start <= end){
mid = start + (end - start) / 2;
if(S[mid] == sum){
while(S[mid] == sum && mid >= 1)
--mid;
return mid + 1;
}
else if(S[mid] < sum)
start = mid + 1;
else
end = mid - 1;
}
return -1;
}
void citire(){
scanf("%d %d", &N, &M);
S[0] = 0;
for(int i = 1; i <= N; ++i){
int el;
scanf("%d", &el);
add(i, el);
S[i] = S[i-1] + el;
}
}
int main(){
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
citire();
for(int i = 0; i < M; ++i){
int code, x, y;
scanf("%d", &code);
if(code == 0 || code == 1){
scanf("%d %d", &x, &y);
if(code == 0)
add(x, y);
else if(code == 1)
printf("%d\n", getSum(y) - getSum(x - 1));
}
else{
scanf("%d", &x);
printf("%d\n", getMinIndex(x));
}
}
return 0;
}