Pagini recente » Cod sursa (job #1735109) | Cod sursa (job #1319240) | Cod sursa (job #2697204) | Cod sursa (job #598359) | Cod sursa (job #988887)
Cod sursa(job #988887)
#include <stdio.h>
#define LMAX 15000 + 10
int aib [LMAX], step [LMAX];
void MakeSteps (int N)
{
int i, last = 2;
step[1] = 1; step[2] = 2;
for (i = 3; i <= N; i ++)
{
if (i == 2 * last)
step[i] = i, last = last * 2;
else
step[i] = step [i - last];
}
}
void BuildTree (int x, int value, int N)
{
while (x <= N)
{
aib[x] = aib[x] + value;
x = x + step[x];
}
}
void Upgrade (int x, int value, int N)
{
while (x <= N)
{
aib[x] = aib[x] - value;
x = x + step[x];
}
}
int Query (int x)
{
int sum = 0;
while (x)
{
sum = sum + aib[x];
x = x - step[x];
}
return sum;
}
int main ()
{
int N, M, i, type, x, y, sum = 0;
freopen ("datorii.in", "r", stdin);
freopen ("datorii.out", "w", stdout);
scanf ("%d%d", &N, &M);
MakeSteps (N);
for (i = 1; i <= N; i ++)
{
scanf ("%d", &x);
BuildTree (i, x, N);
}
while (M --)
{
scanf ("%d%d%d", &type, &x, &y);
if (type == 0)
Upgrade (x, y, N);
else
printf ("%d\n", Query (y) - Query (x - 1));
}
return 0;
}