Cod sursa(job #2999950)

Utilizator alexandrupopa11Alexandru alexandrupopa11 Data 11 martie 2023 19:13:11
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,m,arbore[35001],v[15001];

void build(int nod,int st,int dr)
{
    if(st == dr)
        arbore[nod] = v[st];
    else
    {
        int mid = (st+dr)/2;
        build(nod*2,st,mid);
        build(nod*2+1,mid+1,dr);
        arbore[nod] = arbore[nod*2]+arbore[nod*2+1];
    }
}

void update(int nod,int st,int dr,int poz,int val)
{
    if(st == dr)
        arbore[nod] -= val;
    else
    {
        int mid = (st+dr)/2;
        if(poz <= mid)
            update(nod*2,st,mid,poz,val);
        else
            update(nod*2+1,mid+1,dr,poz,val);
        arbore[nod] = arbore[nod*2]+arbore[nod*2+1];
    }
}

int solve(int nod,int st,int dr,int a,int b)
{
    if(st >= a && dr <= b)
        return arbore[nod];

    int mid = (st+dr)/2;
    if(mid < a)
        return solve(nod*2+1,mid+1,dr,a,b);
    if(mid >= b)
        return solve(nod*2,st,mid,a,b);
    int x = solve(nod*2+1,mid+1,dr,a,b);
    int y = solve(nod*2,st,mid,a,b);
    return x+y;
}

int main()
{
    in>>n>>m;
    for(int i = 1;i<=n;i++)
        in>>v[i];
    build(1,1,n);
    for(int i = 1;i<=m;i++)
    {
        int t,a,b;
        in>>t>>a>>b;
        if(t == 0)
            update(1,1,n,a,b);
        else
            out<<solve(1,1,n,a,b)<<"\n";
    }

    return 0;
}