Cod sursa(job #3130963)

Utilizator TirilaPatricTirila Patric-Gabriel TirilaPatric Data 18 mai 2023 21:32:52
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <iostream>
#include <fstream>
using namespace std;

int arbint[15001];


void crearearbint(int v[], int left, int right, int pos = 1){
    if(left == right) {
        arbint[pos] = v[left];
        return;
    }
    int mid = (left+right)/2;
    crearearbint(v, left, mid, pos*2);
    crearearbint(v, mid+1, right, pos*2+1);
    arbint[pos] = arbint[pos*2]+arbint[pos*2+1];
}

void achitare(int left, int right, int zi, int val, int pos = 1){
    if(left == right){
        arbint[pos] -= val;
        return;
    }
    int mid = (left+right)/2;
    if(zi <= mid){
        achitare(left, mid, zi, val, pos*2);
    } else {
        achitare(mid+1, right, zi, val, pos*2+1);
    }
    arbint[pos] = arbint[pos*2] + arbint[pos*2+1];
}

int getSuma(int left, int right, int ileft, int iright, int pos = 1){
    if(right < ileft || left > iright) return 0;
    if(left >= ileft && right <= iright){
        return arbint[pos];
    }
    if(left == right){
        return arbint[pos];
    }

    int mid = (left+right)/2;

    if(right <= mid){
        return getSuma(left, mid, ileft, iright, pos*2);
    }
    if(left > mid){
        return getSuma(mid+1, right, ileft, iright, pos*2+1);
    }
    int s1 = getSuma(left, mid, ileft, iright, pos*2);
    int s2 = getSuma(mid+1, right, ileft, iright, pos*2+1);
    return s1+s2;
}

int main(){
    ifstream f("datorii.in");
    ofstream g("datorii.out");
    int n, m;
    int a, b, c, v[n+1];
    f>>n>>m;
    for(int i=1; i<=n; i++){
        f>>v[i];
    }

    crearearbint(v, 1, n, 1);
    while(m>0){
        f>>a>>b>>c;
        switch(a){
            case 0: {
                achitare(1, n, b, c, 1);
                break;
            }
            case 1: {
                g<<getSuma(1, n, b, c, 1)<<endl;
                break;
            }
            default: {
                break;
            }
        }
        m--;
    }

    f.close();
    g.close();
    return 0;
}