Cod sursa(job #3218020)

Utilizator lucifer444666Badan Adrian lucifer444666 Data 25 martie 2024 18:02:48
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
//
// Created by lucifer on 25-Mar-24.
//
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F first
#define S second
#define PB push_back
#define int long long
struct segTree{
    int n;
    vector<int> st;
    void init(int sz){
        this->n = sz;
        st.resize(4*n+1,0);

    }
    void build(vector<int> &v){
        build(0,n-1,0,v);
    }
    void build(int start,int end,int node,vector<int> &v){
        if(start == end){
            st[node] = v[start];
            return;
        }
        int mid = (start+end)/2;
        build(start,mid,2*node+1,v);
        build(mid+1,end,2*node+2,v);
        st[node] = st[2*node+1]+st[2*node+2];
    }
    void update(int x,int y){
        update(0,n-1,0,x,y);
    }
    void update(int start,int end,int node,int index,int value){
        if(start == end){
            st[node] -= value;
            return;
        }
        int mid = (start+end)/2;
        if(index <=mid){
            update(start,mid,2*node+1,index,value);
        }else{
            update(mid+1,end,2*node+2,index,value);
        }
        st[node] = st[2*node+1]+st[2*node+2];
    }
    int query(int l,int r){
       return query(0,n-1,0,l,r);
    }
    int query(int start,int end,int node,int l,int r){
        if(start>r || end<l) return 0;
        if(start>=l && end<=r) return st[node];
        int mid = (start+end)/2;
        int q1 = query(start,mid,2*node+1,l,r);
        int q2 = query(mid+1,end,2*node+2,l,r);
        return q1+q2;
    }
};

int32_t main(){
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    int N,M; cin>>N>>M;
    vector<int> v;
    int x;
    for(int i = 0;i<N;i++){
        cin>>x; v.PB(x);
    }
    segTree tree;
    tree.init(N);
    tree.build(v);
    while(M--){
        int a,b,c;cin>>a>>b>>c;
        b-=1;
        if(a == 0){
            //v[b] = (v[b]^(v[b]-1))&v[b];
            tree.update(b,c);
        }else{
            cout<<tree.query(b,c-1)<<'\n';
        }
    }
    return 0;
}