Cod sursa(job #3175135)

Utilizator ayannnnAyan Sorouri-Amoughin ayannnn Data 25 noiembrie 2023 12:46:30
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>

using namespace std;

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

const int N=100000;
int v[N], arb[4*N];

void update(int poz){
    if(poz<1)
        return;
    arb[poz]=arb[poz*2]+arb[poz*2+1];
    update(poz/2);
}

int query(int capat_st, int capat_dr, int stg, int dr, int poz){
    if(capat_st>dr || capat_dr<stg)
        return 0;
    if(capat_st>=stg && capat_dr<=dr)
        return arb[poz];
    int mij=(capat_st + capat_dr) / 2;
    return query(capat_st, mij, stg, dr, poz*2)+
            query(mij+1, capat_dr, stg, dr, poz*2+1);
}

int main()
{
    int n,m;
    cin>>n>>m;
    int log2n=log2(n);
    log2n += ((1<<log2n)<n);
    int siz=1<<log2n;
    for(int i=1; i<=n; i++){
        cin>>v[i];
        arb[siz+i-1]=v[i];
    }
    for(int i=siz; i<siz+n; i++)
        update(i/2);
    for(int i=1; i<=m; i++){
        bool op;
        cin>>op;
        if(op){
            int stg,dr;
            cin>>stg>>dr;
            cout<<query(1,siz,stg,dr,1)<<"\n";
        }else{
            int zi,s;
            cin>>zi>>s;
            int poz=siz+zi-1;
            arb[poz]-=s;
            update(poz/2);
        }
    }
    return 0;
}