Pagini recente » Cod sursa (job #1166115) | Cod sursa (job #2690524) | Cod sursa (job #3128485) | Cod sursa (job #1204162) | Cod sursa (job #2282634)
#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 step = logn, i = 0; step; step >>= 1){
if( i + step <= n and a[i + step] <= val){
val -= a[i + step];
i += step;
}
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;
}