Pagini recente » Cod sursa (job #148352) | Cod sursa (job #2478515) | Cod sursa (job #898179) | Cod sursa (job #548692) | Cod sursa (job #2282636)
#include <cstdio>
const int NMAX = 1e5 + 5;
using namespace std;
FILE *INPUT = fopen("aib.in", "r");
FILE *OUTPUT = fopen("aib.out", "w");
int a[NMAX];
int n, m;
void update(int pos, int val){
while(pos <= n){
a[pos] += val;
pos += pos & (-pos);
}
}
int prefix(int pos){
int res = 0;
while(pos){
res += a[pos];
pos -= pos & (-pos);
}
return res;
}
int range(int ix1, int ix2){
return prefix(ix2) - prefix(ix1 - 1);
}
int search(int val){
int logn;
for(logn = 1; logn < n; logn <<= 1);
for(int i = 0; logn; logn >>= 1){
if(i + logn <= n and val >= a[i+logn]){
i += logn;
val -= a[i];
if(!val)
return i;
}
}
return -1;
}
int main(){
fscanf(INPUT, "%d %d", &n, &m);
for(int i = 1; i <= n; i++){
int val;
fscanf(INPUT, "%d", &val);
update(i, val);
}
while(m--){
int task;
fscanf(INPUT, "%d", &task);
if(task == 0){
int pos, val;
fscanf(INPUT, "%d %d", &pos, &val);
update(pos, val);
}else if(task == 1){
int pos1, pos2;
fscanf(INPUT, "%d %d", &pos1, &pos2);
fprintf(OUTPUT, "%d\n", range(pos1, pos2));
}else{
int val;
fscanf(INPUT, "%d", &val);
fprintf(OUTPUT, "%d\n", search(val));
}
}
return 0;
}