Cod sursa(job #2818305)

Utilizator AndreiP25Prusacov Andrei AndreiP25 Data 15 decembrie 2021 20:26:15
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>
using namespace std;

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

int tree[45000], v[15000];

void build(int node, int left, int right)
{
    if(left==right)
        tree[node]=v[left];
    else
    {
        int middle=(left+right)/2;
        build(node*2, left, middle);
        build(node*2+1, middle+1, right);

        tree[node]=tree[node*2]+tree[node*2+1];
    }
}

void update(int node, int left, int right, int position, int value)
{
    if(left==right)
        tree[node]-=value;
    else
    {
        int middle=(left+right)/2;
        if(position<=middle)
            update(node*2, left, middle, position, value);
        else
            update(node*2+1, middle+1, right, position, value);
        tree[node]=tree[node*2]+tree[node*2+1];
    }
}

int query(int node, int left, int right, int q_left, int q_right)
{
    if(q_left<=left && right<=q_right)
        return tree[node];
    else
    {
        int middle=(left+right)/2;
        if(q_right<=middle)
            return query(node*2, left, middle, q_left, q_right);
        if(q_left>= middle+1)
            return query(node*2+1, middle+1, right, q_left, q_right);

        return query(node*2, left, middle, q_left, q_right)+query(node*2+1, middle+1, right, q_left, q_right);
    }
}

int main()
{
    int N,M,a,b,c;
    fin>>N>>M;
    for(int i=1; i<=N; i++)
        fin>>v[i];
    build(1,1,N);
    for(int i=1; i<=M; i++)
    {
        fin>>a>>b>>c;
        if(a)
            fout<<query(1,1,N,b,c);
        else
            update(1,1,N,b,c);
    }
    return 0;
}