Pagini recente » Cod sursa (job #3198545) | Cod sursa (job #642287) | Cod sursa (job #3239093) | Monitorul de evaluare | Cod sursa (job #202153)
Cod sursa(job #202153)
#include <cstdio>
#define IN "datorii.in"
#define OUT "datorii.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<14
int suma,M,N;
int v[N_MAX];
int lg[N_MAX],rmq[16][N_MAX];
void scan()
{
freopen(IN, "r",stdin);
freopen(OUT, "w",stdout);
scanf("%d%d",&N,&M);
FOR(i,1,N)
scanf("%d", v+i);
}
void update()
{
FOR(i,1,N)
rmq[0][i] = v[i];
for(int i=1; (1<<i) <= N;++i)
for(int j=1;j<=N && j+(1<<i)-1 <= N;++j)
rmq[i][j] = rmq[i-1][j] + rmq[i-1][j+(1<<i) - (1<<(i-1))];
}
void querry(int x,int y)
{
if(x >= y)
suma += rmq[0][x];
else
{
int dif = y-x+1;
int log = lg[dif];
suma += rmq[log][x];
querry(x+(1<<log),y);
}
}
void solve()
{
--lg[0];
FOR(i,1,N)
lg[i] = lg[i/2] + 1;
update();
int t,x,y;
FOR(i,1,M)
{
scanf("%d%d%d\n", &t,&x,&y);
if(!t)
v[x] -= y,
update();
else
{
suma=0;
querry(x,y);
printf("%d\n", suma);
}
}
}
int main()
{
scan();
solve();
return 0;
}