Cod sursa(job #2123669)

Utilizator catalinlupCatalin Lupau catalinlup Data 6 februarie 2018 14:55:47
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include <bits/stdc++.h>
#define INFILE "datorii.in"
#define OUTFILE "datorii.out"
using namespace std;

ifstream in(INFILE);
ofstream out(OUTFILE);
int N,M;
vector<int> arb;

void buildTree(int maxN){
    for(int i=maxN-1;i>0;i--)
        arb[i]=arb[2*i]+arb[2*i+1];
}

void update(int poz,int valSc,int maxN){
    poz+=maxN;
    arb[poz]-=valSc;
    for(int i=poz/2;i>=1;i/=2)
        arb[i]=(arb[2*i]+arb[2*i+1]);
}
int querry(int st,int dr,int maxN){
    st+=maxN;
    dr+=maxN;
    int rez=0;
    for(int s=st,d=dr;s<d;s/=2,d/=2){
       // cout<<s<<" "<<d<<"\n";
        if(s%2) rez+=arb[s++];
        if(d%2) rez+=arb[--d];
       // cout<<rez<<"\n";
    }
    return rez;
}

void Read(){
    in>>N>>M;
    arb.resize(2*N+1);
    for(int i=0;i<N;i++){
        int x;
        in>>x;
        arb[N+i]=x;
    }

    buildTree(N);
}

void Determinare(){
    for(int i=1;i<=M;i++){
        int tip;
        in>>tip;
        if(tip==1){
            int l,r;
            in>>l>>r;
            l--;
            r--;
            //cout<<l<<" "<<r<<querry(l,r+1,N)<<"\n";
            out<<querry(l,r+1,N)<<"\n";
        }
        else if(tip==0){
            int p,val;
            in>>p>>val;
            p--;
            update(p,val,N);
        }
    }
}

int main()
{
    Read();
    Determinare();
    return 0;
}