Cod sursa(job #3002104)

Utilizator stefanvoicaVoica Stefan stefanvoica Data 14 martie 2023 12:57:48
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
#define int long long
#define dim 100009
#define mod 1000000007
using namespace std;
ifstream fin ("datorii.in");
ofstream fout("datorii.out");
int n,m,aint[4*dim];

int join (int x, int y)
{
    int z=x+y;
    return z;
}

void update (int nod,int st,int dr,int poz,int val)
{
    if (st==dr)
    {
        aint[nod]+=val;
        return;
    }
    int mij=(st+dr)/2;
    if (poz<=mij)
        update(2*nod,st,mij,poz,val);
    else    update(2*nod+1,mij+1,dr,poz,val);
    aint[nod]=join(aint[2*nod],aint[2*nod+1]);
}

void update (int x,int y)
{
    update(1,1,n,x,y);
}

int query (int nod,int st,int dr,int ql,int qr)
{
    if (qr<st || dr<ql)
        return 0;
    if (st==ql && dr==qr)
        return aint[nod];
    int mij=(st+dr)/2;
    if (qr<=mij)
        return query (2*nod,st,mij,ql,qr);
    else    if (mij+1<=ql)
        return query(2*nod+1,mij+1,dr,ql,qr);
    else    return join(query(2*nod,st,mij,ql,mij),query(2*nod+1,mij+1,dr,mij+1,qr));
}

int query (int x,int y)
{
    return query(1,1,n,x,y);
}

int32_t main()
{
    fin>>n>>m;
    int op,x,y;
    for (int i=1; i<=n; i++)
    {
        fin>>x;
        update(i,x);
    }
    while (m--)
    {
        fin>>op>>x>>y;
        if (op==0)
            update(x,-y);
        else    fout<<query(x,y)<<'\n';
    }
    return 0;
}