Pagini recente » Cod sursa (job #762040) | Cod sursa (job #853849) | Cod sursa (job #715040) | Cod sursa (job #2632756) | Cod sursa (job #1531944)
#include <stdio.h>
#include <iostream>
#define MAX 100100
#define in "aib.in"
#define out "aib.out"
using namespace std;
int N, tree[MAX];
void Update(int idx, int val){
while(idx <= N){
tree[idx] += val;
idx += (idx & -idx);
}
}
int Read(int idx){
int cumFreq = 0;
while(idx > 0){
cumFreq += tree[idx];
idx -= (idx & -idx);
}
return cumFreq;
}
int Find(int cumFreq){
int idx = 0, bitMask = N;
while((bitMask != 0) && (idx < N)){
int newIdx = idx + bitMask;
if(cumFreq >= tree[newIdx]){
if(cumFreq == tree[newIdx])
return newIdx;
idx = newIdx;
cumFreq -= tree[newIdx];
}
bitMask >>= 1;
}
if(cumFreq != 0)
return -1;
return idx;
}
void AIB(){
freopen(in, "r", stdin);
freopen(out, "w", stdout);
int M, op, a, b;
scanf("%d%d", &N, &M);
for(a = 1; a <= N; ++a){
scanf("%d", &b);
Update(a, b);
}
for(int i = 0; i < M; ++i){
scanf("%d", &op);
if(op < 2){
scanf("%d%d", &a, &b);
if(op == 0)
Update(a, b);
else
printf("%d\n", Read(b)-Read(a-1));
}
else{
scanf("%d", &a);
printf("%d\n", Find(a));
}
}
}
int main(){
AIB();
return 0;
}