Pagini recente » Cod sursa (job #2722886) | Cod sursa (job #60342) | Cod sursa (job #226356) | Cod sursa (job #2288805) | Cod sursa (job #587388)
Cod sursa(job #587388)
#include <iostream>
#include <cmath>
using namespace std;
#define maxN 100005
#define maxRad 350
int A[maxN], sums[maxRad], rad;
void update (int X, int Y)
{
int poz = 0;
if ( ! (X % rad) ) poz = X / rad;
else poz = X / rad + 1;
A[X] -= Y;
sums[poz] -= Y;
}
int query (int X, int Y)
{
int start = 0;
if (X % rad == 1 || ! (X % rad) ) start = X / rad + 1;
else start = X / rad + 2;
int end = 0;
end = Y / rad;
int S = 0;
if (start > end)
{
for (int i = X; i <= Y; ++ i)
S += A[i];
return S;
}
for (int i = start; i <= end; ++ i)
S += sums[i];
for (int i = X; i <= (start - 1) * rad; ++ i)
S += A[i];
for (int i = end * rad + 1; i <= Y; ++ i)
S += A[i];
return S;
}
int main()
{
freopen ("datorii.in", "r", stdin);
freopen ("datorii.out", "w", stdout);
int N, M;
scanf ("%d %d", &N, &M);
for (int i = 1; i <= N; ++ i)
scanf ("%d", &A[i]);
rad = (int) sqrt ( (double) N );
int dim = N / rad;
for (int i = 1; i <= dim; ++ i)
for (int j = (i - 1) * rad + 1; j <= i * rad; ++ j)
sums[i] += A[j];
if (rad * dim < N)
{
++ dim;
for (int i = rad * (dim - 1) + 1; i <= N; ++ i)
sums[dim] += A[i];
}
for (int i = 1; i <= M; ++ i)
{
int type, X, Y;
scanf ("%d %d %d", &type, &X, &Y);
if (! type) update (X, Y);
else printf ("%d\n", query (X, Y));
}
return 0;
}