Pagini recente » Cod sursa (job #1528559) | Cod sursa (job #371914) | Cod sursa (job #750771) | Cod sursa (job #1884587) | Cod sursa (job #2386570)
#include <cstdio>
#include <cmath>
using namespace std;
int n, m, k;
int arb[32000];
int a, b, T;
void constr(int st, int dr, int poz)
{
if(st == dr)
{
//arb[poz/2] += arb[poz];
return;
}
int mij = (st + dr)/2;
constr(st, mij, poz * 2);
constr(mij+1, dr, poz * 2 + 1);
arb[poz] = arb[poz*2] + arb[poz*2+1];
}
void cera(int V, int poz)
{
int pozaux = poz + k - 1;
while(pozaux != 0)
{
arb[pozaux] -= V;
pozaux /= 2;
}
}
/// a st dr b
int cerb(int st, int dr, int poz)
{
if(dr < a || st > b)
return 0;
if(a <= st && dr <= b)
return arb[poz];
int mij = (st + dr)/2;
int pst = cerb(st, mij, poz*2);
int pdr = cerb(mij+1, dr, poz*2 + 1);
return pst + pdr;
}
int main()
{
freopen("datorii.in", "r", stdin);
freopen("datorii.out", "w", stdout);
scanf("%d %d", &n, &m);
k = pow(2, ceil(log2(n)));
for(int i=1; i<=n; i++)
scanf("%d", &arb[i+k-1]);
constr(1, k, 1);
for(int i=1; i<=m; i++)
{
scanf("%d %d %d", &T, &a, &b);
if(T == 0) /// scade val a, de pe poz b
cera(b, a);
else printf("%d\n", cerb(1, k, 1)); /// face suma de la a-b
}
return 0;
}