Pagini recente » Cod sursa (job #1722212) | Cod sursa (job #1202390) | Cod sursa (job #2654558) | Cod sursa (job #506400) | Cod sursa (job #1248294)
#include <cstdio>
using namespace std;
const int Max = 100001;
int AIB[Max], N;
int LSB(int X)
{
return X&-X;
}
void Update(int Pos, int Val)
{
/// Update element on position Pos with Val.
for(; Pos <= N; Pos += LSB(Pos))
AIB[Pos] += Val;
}
int Query(int Pos)
{
/// Returns sum of elements 1, 2, ... , n.
int Sum = 0;
for(; Pos; Pos -= LSB(Pos))
Sum += AIB[Pos];
return Sum;
}
int Search(int K)
{
int Begin = 1, End = N, Middle, LF=-1, Aux;
while(Begin <= End)
{
Middle = (Begin+End)>>1;
Aux = Query(Middle);
if(Aux < K) Begin = Middle+1;
if(Aux > K) End = Middle-1;
if(Aux == K)
{
End = Middle-1;
LF = Middle;
}
}
return LF;
}
int main()
{
freopen("aib.in" , "r", stdin);
freopen("aib.out", "w", stdout);
int M, i, Type, A, B;
scanf("%d %d", &N, &M);
for(i = 1; i <= N; i++)
{
scanf("%d", &A);
Update(i,A);
}
for(i = 1; i <= M; i++)
{
scanf("%d", &Type);
if(Type == 2)
{
scanf("%d", &A);
printf("%d\n", Search(A));
}
else
{
scanf("%d %d", &A, &B);
if(Type == 0) Update(A,B);
else printf("%d\n", Query(B) - Query(A-1));
}
}
return 0;
}