Pagini recente » Cod sursa (job #1283826) | Cod sursa (job #1721614) | Cod sursa (job #1517582) | Cod sursa (job #2958409) | Cod sursa (job #1532636)
#include <stdio.h>
#include <iostream>
#define MAX 100100
#define in "aib.in"
#define out "aib.out"
using namespace std;
int N, B, 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 = B;
while(bitMask){
int newIdx = idx + bitMask;
if(newIdx <= N){
if(cumFreq >= tree[newIdx]){
cumFreq -= tree[newIdx];
idx += bitMask;
if(!cumFreq) return newIdx;
}
}
bitMask >>= 1;
}
return -1;
}
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(B = 1; B < N; B <<= 1);
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;
}