Pagini recente » Cod sursa (job #873606) | Cod sursa (job #458492) | Cod sursa (job #3273700) | Cod sursa (job #425340) | Cod sursa (job #2285982)
#include <cstdio>
#define lsb(x) ((x) & (-x))
const int NMAX = 1e5 + 5;
using namespace std;
FILE *INPUT = fopen("aib.in", "r");
FILE *OUTPUT = fopen("aib.out", "w");
int n, m;
int a[NMAX];
void add(int i, int x){
while(i <= n)
a[i] += x, i += lsb(i);
}
int sum(int i){
int s = 0;
while(i)
s += a[i], i -= lsb(i);
return s;
}
int search(int k){
int sol = -1;
int left = 1;
int right = n;
while(left <= right){
int mid = (left + right) / 2;
int s = sum(mid);
if(s == k){
sol = mid;
right = mid - 1;
}else if(s > k){
right = mid - 1;
}else
left = mid + 1;
}
return sol;
}
int main(){
fscanf(INPUT, "%d %d", &n, &m);
for(int i = 1; i <= n; i++){
int x;
fscanf(INPUT, "%d", &x);
add(i, x);
}
while(m--){
int task;
fscanf(INPUT, "%d", &task);
if(task == 0){
int pos, x;
fscanf(INPUT, "%d %d", &pos, &x);
add(pos, x);
}else if(task == 1){
int x, y;
fscanf(INPUT, "%d %d", &x, &y);
fprintf(OUTPUT, "%d\n", sum(y) - sum(x-1));
}else{
int k;
fscanf(INPUT, "%d" , &k);
fprintf(OUTPUT, "%d\n" , search(k));
}
}
return 0;
}