Cod sursa(job #1252201)

Utilizator OnimushaLordTiberiu Copaciu OnimushaLord Data 30 octombrie 2014 15:40:04
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
# include <cstdio>
# define N 30010

using namespace std;

int T[N];
int n,m,i,op,x,y,val;

inline void actualizare(int nod, int st, int dr, int val, int poz)
{
    int m;
    if(dr<=poz && poz<=st)
    {
        T[nod]+=val;
        return;
    }
    m=(st+dr)>>1;

    if(poz<=m) actualizare((nod<<1), st, m, val, poz);
    else actualizare((nod<<1)+1, m+1, dr, val, poz);

    T[nod]+=val;
}

inline int interogare(int nod, int st, int dr, int x, int y)
{
    int x1=0,x2=0;
    int m;
    if(x<=st && dr<=y) return T[nod];

    m=(st+dr)>>1;
    if(x<=m) x1=interogare((nod<<1), st, m, x, y);
    if(m<y) x2=interogare((nod<<1)+1, m+1, dr, x, y);
    return (x1+x2);

}

int main()
{
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);

    scanf("%d %d\n", &n, &m);
    for(i=1; i<=n; ++i)
    {
        scanf("%d", &val);
        actualizare(1,1,n,val,i);
    }
    for(i=1; i<=m; ++i)
    {
        scanf("%d %d %d\n", &op, &x, &y);
        if(op) printf("%d\n", interogare(1,1,n,x,y));
        else actualizare(1,1,n,-y,x);
    }
    return 0;
}