Pagini recente » Cod sursa (job #3145985) | Cod sursa (job #3250106) | Cod sursa (job #2476439) | Cod sursa (job #2160935) | Cod sursa (job #1413953)
#include<bits/stdc++.h>
#define Nmax 100005
using namespace std;
int N, M, Arb[Nmax], val;
void Uptade(int Poz, int val)
{
int C = 0;
while(Poz <= N) {
Arb[Poz] += val;
while(!(Poz & (1 << C)))
++ C;
Poz += (1 << C);
}
}
int Query(int Dr)
{
int C = 0, Answer = 0;
while(Dr) {
Answer += Arb[Dr];
while(!(Dr & (1 << C)))
++ C;
Dr -= (1 << C);
}
return Answer;
}
int Search(int Val)
{
int step, i;
for(step = 1; step <= N; step <<= 1);
for(i = 1; step; step >>= 1)
if(i + step <= N && Query(i + step) <= Val)
i += step;
if(Query(i) == Val)
return i;
return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &N, &M);
for(int i = 1; i <= N; Uptade(i, val), ++ i)
scanf("%d", &val);
for( ; M; -- M) {
int tip, A, B;
scanf("%d", &tip);
if(tip == 0) {
scanf("%d %d", &A, &B);
Uptade(A, B);
continue;
}
if(tip == 1) {
scanf("%d %d", &A, &B);
printf("%d\n", Query(B) - Query(A - 1));
continue;
}
if(tip == 2) {
scanf("%d", &A);
printf("%d\n", Search(A));
}
}
return 0;
}