Pagini recente » Cod sursa (job #1003956) | clasament-teme | Cod sursa (job #2106324) | Cod sursa (job #2545543) | Cod sursa (job #202152)
Cod sursa(job #202152)
#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 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))];
}
int querry(int x,int y)
{
if(x >= y)
return rmq[0][x];
else
{
int dif = y-x+1;
int log = lg[dif];
return 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
printf("%d\n", querry(x,y) );
}
}
int main()
{
scan();
solve();
return 0;
}