Cod sursa(job #3001768)

Utilizator Diana_IonitaIonita Diana Diana_Ionita Data 13 martie 2023 21:43:39
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
#define nmax 15005
int arb[4*nmax],v[nmax];
int n,m,i,a,b,x;
void build(int nod, int st, int dr)
{
    if(st==dr)
    {
        arb[nod]=v[st];
        return;
    }
    int mij=(st+dr)/2;
    build(2*nod,st,mij);
    build(2*nod+1,mij+1,dr);
    arb[nod]=arb[2*nod]+arb[2*nod+1];
}

void update(int nod, int left, int right,int pos, int val)
{
    if( left == right)
    {
        arb[nod] = v[left];
        return ;
    }

    int mid = (left + right) / 2;

    if(pos <= mid)
        update( 2 * nod, left, mid, pos, val);
    else
        update(2 * nod + 1, mid + 1, right, pos, val);

    arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
}
int query(int nod, int left, int right, int qleft, int qright)
{
    if(left >= qleft && right <= qright)
    {
        return arb[nod];
    }

    int mid = (left + right) / 2;
    int s = 0;
    if(qleft <= mid && qright > mid)
        return query(2 * nod, left, mid, qleft, qright) + query(2 * nod + 1, mid + 1, right, qleft, qright);
    if(qleft <= mid)
        return query(2 * nod, left, mid, qleft, qright);
    else
        return  query(2 * nod + 1, mid + 1, right, qleft, qright);
}
int main()
{
    int t;
    fin>>n>>m;
    for(i=1; i<=n; i++)
    {
       fin>>v[i];
    }
    int tip;
        build(1,1,n);
    for(i=1; i<=m; i++)
    {
        fin>>tip;
        if(tip==0)
        {
            fin>>t>>x;
            v[t]-=x;

            update(1,1,n,t,x);

        }
        else
        {
            fin>>a>>b;
            fout<< query(1,1,n,a,b)<<'\n';
        }
    }
    return 0;
}