Cod sursa(job #1785231)

Utilizator andru47Stefanescu Andru andru47 Data 20 octombrie 2016 22:59:20
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>
#define per pair<int,int>
#define f first
#define s second
#define pb push_back
#define mp make_pair
using namespace std;
const int NMAX = 30000 + 5;
int arb[NMAX],instr,x,y,n,m;
inline void build()
{
    for (int i = n - 1; i; --i)
        arb[i] = arb[i*2] + arb[i*2 + 1];
    return ;
}
inline void update(int pos,int val)
{
    arb[pos+=n-1] -= val;
    for (pos/=2; pos; pos/=2)
        arb[pos] = arb[pos*2] + arb[pos*2 + 1];
    return ;
}
inline int query(int st,int dr)
{
    st+=n-1;
    dr += n;
    int sum = 0;
    while(st<dr)
    {
        if (st&1)
            sum+=arb[st++];
        if (dr&1)
            sum+=arb[--dr];
        st/=2;
        dr/=2;
    }
    return sum;
}
int main()

{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    scanf("%d %d\n", &n, &m);
    for (int i = 0; i<n; ++i)
        scanf("%d", &arb[i+n]);
    build();
    for (int i = 1; i<=m; ++i)
    {
        scanf("%d %d %d\n",&instr,&x,&y);
        if (instr==0)
            update(x,y);
        else printf("%d\n",query(x,y));
    }
    return 0;
}