Pagini recente » Cod sursa (job #1563078) | Cod sursa (job #2563451) | Cod sursa (job #10395) | Cod sursa (job #2347259) | Cod sursa (job #1385389)
#include<bits/stdc++.h>
using namespace std;
int N, M, Arb[131072];
void Uptade(int poz, int val)
{
while(poz <= N) {
Arb[poz] += val;
int C = 0;
while(!(poz & (1 << C)))
++ C;
poz += (1 << C);
}
}
int Query(int poz)
{
int Sum = 0;
while(poz > 0){
Sum += Arb[poz];
int C = 0;
while(!(poz & (1 << C)))
++ C;
poz -= (1 << C);
}
return Sum;
}
int Search(int Sum)
{
int step, i;
for(step = 1; step < N; step <<= 1);
for(i = 1; step; step >>= 1)
if(i + step <= N && Query(i + step) <= Sum)
i += step;
if(Query(i) == Sum)
return i;
return -1;
}
int main()
{
int val,a,b;
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 ) {
scanf("%d", &val);
if(val == 0) {
scanf("%d %d", &a, &b);
Uptade(a, b);
}
if(val ==1 ) {
scanf("%d %d", &a, &b);
printf("%d\n", Query(b) - Query (a - 1));
}
if(val == 2) {
scanf("%d", &a);
printf("%d\n", Search(a));
}
}
return 0;
}