Pagini recente » Cod sursa (job #2930173) | Cod sursa (job #437961) | Cod sursa (job #1309174) | Cod sursa (job #112959) | Cod sursa (job #2186785)
#include <iostream>
#include <stdio.h>
#define MMAX 100002
using namespace std;
int n,m,aib[MMAX];
int next(int pos)
{
return pos & (-pos);
}
void update(int pos, int val)
{
while(pos <= n)
{
aib[pos] += val;
pos += next(pos);
}
}
int get_val(int pos)
{
int sum = 0;
while(pos > 0)
{
sum += aib[pos];
pos -= next(pos);
}
return sum;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int a,b;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; ++i)
{
int val;
scanf("%d", &val);
update(i,val);
}
for(int i = 1; i <= m; ++i)
{
int c;
scanf("%d %d", &c, &a);
if(c == 0)
{
scanf("%d", &b);
update(a,b);
}
else if(c == 1)
{
scanf("%d", &b);
printf("%d\n", get_val(b) - get_val(a-1));
}
else
{
int pow2, t;
for(pow2 = 1; pow2 < n; pow2 <<= 1);
for(t = 0; pow2; pow2 >>= 1)
if(pow2+t <= n && get_val(pow2+t) <= a)
t += pow2;
if(get_val(t) == a)
printf("%d\n", t);
else
printf("-1\n");
}
}
return 0;
}