Cod sursa(job #1252204)

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

using namespace std;

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

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(2*nod, st, m, val, poz);
    else actualizare(2*nod+1, m+1, dr, val, poz);

    T[nod]=T[2*nod]+T[2*nod+1];
}

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(2*nod, st, m, x, y);
    if(m<y) x2=interogare(2*nod+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);
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}