Cod sursa(job #2244755)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 23 septembrie 2018 16:39:08
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <iostream>
#include <fstream>

const int MAXN = 4e5 + 5;

using namespace std;

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

int tree[MAXN],v[MAXN],n,q;

void update(int pos,int value,int nod = 1,int left = 1,int right = n){
    if(left == right){
        if(!tree[nod])
            tree[nod] = value;
        else
            tree[nod] -= value;
        return;
    }

    int mid = (right + left) / 2;
    if(pos <= mid)
        update(pos,value,nod * 2,left,mid);
    else
        update(pos,value,nod * 2 + 1,mid + 1,right);
    tree[nod] = tree[nod * 2] + tree[nod * 2 + 1];
}
int query(int qa,int qb,int nod = 1,int left = 1,int right = n){
    if(qa <= left && right <= qb)
        return tree[nod];
    if(right < qa || qb < left)
        return 0;
    int mid = (left + right) / 2;
    return query(qa,qb,nod * 2,left,mid) + query(qa,qb,nod * 2 + 1,mid + 1,right);
}

int main()
{
    in>>n>>q;
    for(int i = 1; i <= n; i++){
        in>>v[i];
        update(i,v[i]);
    }
    for(int i = 1; i <= q; i++){
        int type,a,b;
        in>>type>>a>>b;
        if(!type){
            update(a,b);
        }
        else
            out<<query(a,b)<<"\n";
    }
    return 0;
}