Cod sursa(job #2725034)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 18 martie 2021 12:07:04
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
//Ilie Dumitru
#include<cstdio>

int p0, p1, pos, val, arb[15001*40];

int query(int nod, int st, int dr)
{
    if(p0<=st && dr<=p1)
        return arb[nod];
    int a=0, b=0, mid=(st+dr)>>1;
    if(p0<=mid)
        a=query(nod<<1, st, mid);
    if(mid<p1)
        b=query((nod<<1)+1, mid+1, dr);
    return a+b;
}

void update(int nod, int st, int dr)
{
    if(st==dr)
        arb[nod]=val;
    else
    {
        int mid=(st+dr)>>1;
        if(pos<=mid)
            update(nod<<1, st, mid);
        else
            update((nod<<1)+1, mid+1, dr);
        arb[nod]=arb[(nod<<1)+1]+arb[nod<<1];
    }
}

int main()
{
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);
    int N, M, op, a, b, v[15001];
    scanf("%i%i", &N, &M);
    for(pos=1;pos<=N;++pos)
    {
        scanf("%i", &val);
        v[pos]=val;
        update(1, 1, N);
    }
    while(M--)
    {
        scanf("%i%i%i", &op, &a, &b);
        if(op)
        {
            p0=a;
            p1=b;
            printf("%i\n", query(1, 1, N));
        }
        else
        {
            val=v[a]=v[a]-b;
            pos=a;
            update(1, 1, N);
        }
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}