Cod sursa(job #3252611)

Utilizator Dragu_AndiDragu Andrei Dragu_Andi Data 30 octombrie 2024 11:38:16
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int nmax=15001;
int v[nmax], aint[nmax*4];

void build_aint(int nod, int l, int r)
{
    if(l==r)
    {
        aint[nod]=v[l];
        return;
    }
    build_aint(nod*2, l, (l+r)/2);
    build_aint(nod*2+1, (l+r)/2+1, r);
    aint[nod]=aint[nod*2]+aint[nod*2+1];
}

void achit(int nod, int l, int r, int T, int V)
{
    if(l==r)
    {
        aint[nod]-=V;
        return;
    }
    if(T<=(l+r)/2)
        achit(nod*2, l, (l+r)/2, T, V);
    else
        achit(nod*2+1, (l+r)/2+1, r, T, V);
    aint[nod]=aint[2*nod]+aint[2*nod+1];
}

void query(int nod, int l, int r, int a, int b, int &ans)
{
    if(a<=l && r<=b)
    {
        ans+=aint[nod];
        return;
    }
    if(a<=(l+r)/2)
        query(nod*2, l, (l+r)/2, a, b, ans);
    if(b>(l+r)/2)
        query(nod*2+1, (l+r)/2+1, r, a, b, ans);
}

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