Cod sursa(job #2007378)

Utilizator sergiudnyTritean Sergiu sergiudny Data 2 august 2017 16:48:07
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <bits/stdc++.h>
#define DM 15005
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");

int segmTree[4*DM],v[DM],n,m,cod,a,b,V;

void make_tree(int nod,int st,int dr){
    if(st==dr){
        segmTree[nod]=v[st];
        return;
    }
    int mid=(st+dr)/2,fs=2*nod;
    make_tree(fs,st,mid),make_tree(fs+1,mid+1,dr);
    segmTree[nod]=segmTree[fs]+segmTree[fs+1];
}

void change(int nod,int st,int dr,int poz,int val){
    if(st==dr){
        segmTree[nod]-=val;
        return;
    }
    int mid=(st+dr)/2, fs=2*nod;
    if(poz<=mid) change(fs,st,mid,poz,val);
    else change(fs+1,mid+1,dr,poz,val);
    segmTree[nod]=segmTree[fs]+segmTree[fs+1];
}

int get_val(int nod,int st,int dr,int a,int b){
    if(st>=a && dr<=b)
        return segmTree[nod];
    if(a>dr || b<st)
        return 0;
    int mid=(st+dr)/2,fs=2*nod;
    return (get_val(fs,st,mid,a,b)+get_val(fs+1,mid+1,dr,a,b));
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;++i) fin>>v[i];
    make_tree(1,1,n);
    while(m--){
        fin>>V>>a>>b;
        if(!V) change(1,1,n,a,b);
        else fout<<get_val(1,1,n,a,b)<<'\n';
    }
    return 0;
}