Cod sursa(job #2783600)

Utilizator alexdumitruAlexandru Dumitru alexdumitru Data 14 octombrie 2021 19:23:32
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n,q,i,v[20000],a[70000],x,y,z;
void build(int nod, int st, int dr)
{
    if(st==dr)a[nod]=v[st];
    else {
        int m=st+(dr-st)/2;
        build(nod*2,st,m);
        build(nod*2+1,m+1,dr);
        a[nod]=a[nod*2]+a[nod*2+1];
    }
}
void update(int nod, int st, int dr, int poz, int val)
{
    if(st==dr)a[nod]-=val;
    else {
        int m=st+(dr-st)/2;
        if(poz<=m)update(nod*2,st,m,poz,val);
        else update(nod*2,m+1,dr,poz,val);
        a[nod]=a[nod*2]+a[nod*2+1];
    }
}
int getsum(int nod, int st, int dr, int gs, int gd)
{
    int s1=0,s2=0,m=st+(dr-st)/2;
    if(gs<=st&&dr<=gd)return a[nod];
    if(gs<=m)s1=getsum(nod*2,st,m,gs,gd);
    if(m<gd)s2=getsum(nod*2+1,m+1,dr,gs,gd);
    return s1+s2;
}
int main()
{
    fin>>n>>q;
    for(i=1;i<=n;i++)fin>>v[i];
    build(1,1,n);
    while(q--)
    {
        fin>>x>>y>>z;
        if(!x)update(1,1,n,y,z);
        else fout<<getsum(1,1,n,y,z)<<'\n';
    }
    return 0;
}