Cod sursa(job #2625801)

Utilizator Harsa_AndreiHarsa Andrei Harsa_Andrei Data 6 iunie 2020 10:15:18
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("datorii.in");
ofstream fout ("datorii.out");

int aint[60001],v[15001];

void build (int node,int l,int r)
{
    if (l>r)
        return;

    if (l==r)
    {
        aint[node]=v[l];
        return;
    }

    int mid=(l+r)/2;
    build(2*node,l,mid);
    build(2*node+1,mid+1,r);

    aint[node]=aint[2*node]+aint[2*node+1];
}
void update (int node,int l,int r,int poz,int val)
{
    if (l>r || poz>r || poz<l)
        return;

    if (l==r)
    {
        aint[node]-=val;
        return;
    }

    int mid=(l+r)/2;
    update(2*node,l,mid,poz,val);
    update(2*node+1,mid+1,r,poz,val);
    aint[node]=aint[2*node]+aint[2*node+1];

}
int query (int node,int l,int r,int ql,int qr)
{
    if (l>r || l>qr || r<ql)
        return 0;

    if (ql<=l && r<=qr)
        return aint[node];

    int mid=(l+r)/2;
    int sum=query(2*node,l,mid,ql,qr);
    sum=sum+query(2*node+1,mid+1,r,ql,qr);
    return sum;

}
int main ()
{
    int n,m,i,tip,a,b;
    fin>>n>>m;
    for (i=1; i<=n; i++)
        fin>>v[i];
    build(1,1,n);
    for (i=1; i<=m; i++)
    {
        fin>>tip>>a>>b;
        if (tip==0)
            update(1,1,n,a,b);
        else
            fout<<query(1,1,n,a,b)<<'\n';
    }
    return 0;
}