Cod sursa(job #3126137)

Utilizator GFA03Gavrila Florin-Alexandru GFA03 Data 6 mai 2023 11:15:23
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

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

#define maxn 15005

int v[maxn];
int aint[4*maxn];


void build(int n, int left, int right){
    int mid = (left + right)/2;
    if(left == right){
        aint[n] = v[left];
    }else{
        build(2*n, left, mid);
        build(2*n+1, mid+1, right);
        aint[n] = aint[2*n] + aint[2*n+1];
    }
}

void update(int n, int left, int right, int p, int val){
    int mid = (left + right)/2;
    if(left == right)
    {
        aint[n] = val;
        return;
    }   
        if(p <= mid){
            update(2*n, left, mid, p, val);
        }else{
            update(2*n+1, mid+1, right, p, val);
        }
        aint[n] = aint[2*n] + aint[2*n+1];
}

int query(int n, int left, int right, int a, int b){
    int mid = (left+right)/2;
    if(b < left || a > right)
        return 0;
    if(a <= left && right <= b)
        return aint[n];
    return query(2*n, left, mid, a, b) + query(2*n+1, mid+1, right, a, b);
}


int main()
{
    int n, m, p ,q;
    fin >> n >> m;
    for(int i = 1; i <= n; ++i)
        fin >> v[i];
    build(1, 1, n);
    int operationType, leftIntervalOrPos, rightIntervalOrVal;
    for(int i = 1; i <= m; ++i)
    {
        fin >> operationType >> leftIntervalOrPos >> rightIntervalOrVal;
        if(operationType == 0)
        {
            update(1, 1, n, leftIntervalOrPos, v[leftIntervalOrPos] - rightIntervalOrVal);
        }else
        {
            fout << query(1, 1, n, leftIntervalOrPos, rightIntervalOrVal) << '\n';
        }
    }
}