Cod sursa(job #2939950)

Utilizator Gica-gicutaGeorge Gica-gicuta Data 14 noiembrie 2022 16:06:20
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
const int cst=15005;
int v[cst],arb[4*cst];
void build(int nod,int i1,int i2)
{
    if(i1==i2)
        arb[nod]=v[i1];
    else
    {
        int mij=(i1+i2)/2;
        build(2*nod,i1,mij);
        build(2*nod+1,mij+1,i2);
        arb[nod]+=arb[2*nod]+arb[2*nod+1];
    }
}
void mod(int nod,int i1,int i2,int i,int a)
{
    if(i1==i2)
        arb[nod]-=a;
    else
    {
        int mij=(i1+i2)/2;
        if(i<=mij)
            mod(2*nod,i1,mij,i,a);
        else
            mod(2*nod+1,mij+1,i2,i,a);
        arb[nod]-=a;
    }
}
int calc(int nod,int i1,int i2,int a,int b)
{
    if(i1>=a&&b>=i2)
        return arb[nod];
    else
    {
        int mij=(i1+i2)/2;
        if(b<=mij)
            return calc(2*nod,i1,mij,a,b);
        else if(a>=mij+1)
            return calc(2*nod+1,mij+1,i2,a,b);
        return calc(2*nod,i1,mij,a,b)+calc(2*nod+1,mij,i2,a,b);
    }
}
int main()
{
    int n,k;
    fin>>n>>k;
    for(int i=1; i<=n; i++)
    {
        fin>>v[i];
    }
    build(1,1,n);
    for(int i=1; i<=n; i++)
    {
        int c,a,b;
        fin>>c>>a>>b;
        if(!c)
            mod(1,1,n,a,b);
        else
            fout<<calc(1,1,n,a,b)<<'\n';
    }
    return 0;
}