Pagini recente » Cod sursa (job #649393) | Cod sursa (job #1066877) | Cod sursa (job #316294) | Cod sursa (job #1635615) | Cod sursa (job #1100582)
#include <cstdio>
#include <algorithm>
#define MAX 100005
int A[MAX], N, M, X, Y, Op;
void Update(int idx, int val){
while (idx <= N){
A[idx] += val;
idx += idx & -idx;
}
}
int Query(int idx){
int R = 0;
while (idx > 0){
R += A[idx];
idx -= idx & -idx;
}
return R;
}
int CautBin(int val){
int Left = 1, Right = N, Middle;
while (Right - Left > 1){
Middle = (Left + Right) / 2;
if (Query(Middle) < val) Left = Middle; else Right = Middle;
}
return Query(Left) == X ? Left : Query(Right) == X ? Right : -1;
}
int main(){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; i++)
{
scanf("%d", &X);
Update(i, X);
}
for (int i = 0; i < M; i++){
scanf("%d", &Op);
if (Op == 0){
scanf("%d %d", &X, &Y);
Update(X, Y);
}
else if (Op == 1){
scanf("%d %d", &X, &Y);
if (X > Y) std::swap(X, Y);
printf("%d\n", Query(Y) - Query(X - 1));
}
else {
scanf("%d", &X);
printf("%d\n", CautBin(X));
}
}
}