Cod sursa(job #3033503)

Utilizator GeorgeAndreiGeorge Andrei Iarca GeorgeAndrei Data 24 martie 2023 01:06:20
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<fstream>
#include<iostream>

using namespace std;

int A[15001];
int tree[4*15000+1];

void build(int node, int a, int b) {
    if (a == b) {
        tree[node] = A[a];
        return;
    }

    int mid = (a+b)/2;
    build(node*2, a, mid);
    build(node*2+1, mid+1, b); 

    tree[node] = tree[node*2] + tree[node*2+1];
}

void achit(int zi, int val, int st, int dr, int node) {
    if (st == dr) {
        tree[node] -= val;
        return;
    }
    int mid = (st+dr)/2;
    if (zi <= mid) achit(zi, val, st, mid, node*2);
    else achit(zi, val, mid+1, dr, node*2+1);

    tree[node] = tree[node*2] + tree[node*2+1];
}

int suma(int from, int to, int st, int dr, int node) {
    if (from <= st && to >= dr) {
        return tree[node];
    }

    int mid = (st+dr)/2;
    if (to <= mid) return suma(from, to, st, mid, node*2);
    if (from >= mid+1) return suma(from, to, mid+1, dr, node*2+1);

    return suma(from, to, st, mid, node*2) + suma(from, to, mid+1, dr, node*2+1);
}

int main() {
    ifstream f("datorii.in");
    ofstream g("datorii.out");

    int N, M;

    f >> N >> M;

    for (int i = 1; i <= N; i++) {
        f >> A[i];
    }
    build(1, 1, N);
    int opt, a, b;
    for (int i = 0; i < M; i++) {
        f >> opt >> a >> b;
        if (opt == 0) achit(a, b, 1, N, 1);
        else g << suma(a, b, 1, N, 1) << "\n";
    }
    f.close();
    g.close();

    return 0;
}