Pagini recente » Cod sursa (job #1819499) | Cod sursa (job #2662224) | Cod sursa (job #236102) | Cod sursa (job #55738) | Cod sursa (job #934)
Cod sursa(job #934)
#include <stdio.h>
int v[15][15005];
int log2 (int x) {
int log=0, p=1;
while (p<x) { p<<=1; log++; }
return log; }
int suma (int l, int r, int n) {
if (l>r) return 0;
if (l==r) return v[0][l];
int c=(r>>n)<<n;
if (l==c && l+(1<<n)-1==r) return v[n][l>>n];
c=(r>>(n-1))<<(n-1);
if (l<c)
return suma (l, c-1, n-1) + suma (c, r, n-1);
else
return suma (l, r, n-1);
}
int main() {
int n, m, i, j, a, b, c, x;
freopen ("datorii.in", "r", stdin);
freopen ("datorii.out", "w", stdout);
scanf ("%d%d", &n, &m);
for (i=0;i<n;i++) scanf ("%d", &v[0][i]);
x=log2(n);
for (i=n;i<1<<x;i++) v[0][i]=0;
for (i=1;i<=x;i++)
for (j=0;j<=(n>>i);j++)
v[i][j]=v[i-1][2*j]+v[i-1][2*j+1];
for (i=0;i<m;i++) {
scanf ("%d%d%d", &a, &b, &c);
if (a==0) {
b--;
for (j=0;j<=x;j++)
v[j][b>>j]-=c; }
else {
b--; c--;
if (b==c)
printf ("%d\n", v[0][b]);
else {
j=log2(c-b+1);
a=(c>>j)<<j;
if (b<=a-1)
printf ("%d\n", suma (b, a-1, j) + suma(a, c, j));
else
printf ("%d\n", suma (b, c, j)); } } }
return 0; }