Cod sursa(job #2958070)

Utilizator Luka77Anastase Luca George Luka77 Data 24 decembrie 2022 14:30:41
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;

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

///GLOBAL VARIABLES
const int NMAX = 15005;
int n, q, seg_tree[NMAX], ans, num;

inline void update(int node, int st, int dr, int pos, int val, bool adaos)
{
    if(st == dr)
    {
        if(adaos)
            seg_tree[node] = val;
        else
            seg_tree[node]-=val;
    }
    else
    {
        int mid = (st + dr) / 2;
        if(pos <= mid)
            update(node*2, st, mid, pos, val, adaos);
        else
            update(node*2+1, mid+1, dr, pos, val, adaos);
        seg_tree[node] = seg_tree[node*2] + seg_tree[node*2+1];
    }
}

inline void query(int node, int ArbSt, int ArbDr, int st, int dr)
{
    if(ArbSt > dr || ArbDr < st)
        return;
    if(ArbDr <= dr && ArbSt >= st)
    {
        ans+=seg_tree[node];
        return;
    }
    int mid = (ArbSt + ArbDr) / 2;
    query(node*2, ArbSt, mid, st, dr);
    query(node*2+1, mid+1, ArbDr, st, dr);
}

int main()
{
    fin >> n >> q;
    for(int i = 1; i <= n; ++ i)
    {
        fin >> num;
        update(1,1,n,i,num,true);
    }
    while(q--)
    {
        bool tip;
        int a, b;
        fin >> tip >> a >> b;
        if(!tip)
        {
            update(1,1,n,a,b,false);
        }
        else
        {
            ans = 0;
            query(1,1,n,a,b);
            fout << ans << '\n';
        }
    }
}