Cod sursa(job #3322803)

Utilizator McMeatGhenea Radu Stefan McMeat Data 15 noiembrie 2025 19:08:01
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fein("datorii.in");
ofstream g("datorii.out");
#define NMAX 2000000001
#define pii pair<int,int>

int n, q, a[15001], sol;

struct segment_tree {
    vector<int> v;
    int p2;

    void init() {
        p2=1;
        while(p2<n) {
            p2<<=1;
        }
        v.assign(p2*2, 0);
    }

    void build(int nod, int st, int dr) {
        if(st==dr) {
            v[nod]=a[st];
        }
        else {
            int mid=(st+dr)/2;
            build(nod*2, st, mid);
            build(nod*2+1, mid+1, dr);
            v[nod]=v[nod*2]+v[nod*2+1];
        }
    }

    void subtract(int nod, int st, int dr, int pos, int val) {
        if(st==dr) {
            v[nod]-=val;
            a[st]-=val;
        }
        else {
            int mid=(st+dr)/2;
            if(pos<=mid) {
                subtract(nod*2, st, mid, pos, val);
            }
            else {
                subtract(nod*2+1, mid+1, dr, pos, val);
            }
            v[nod]=v[nod*2]+v[nod*2+1];
        }
    }
    void range(int nod, int st, int dr, int a, int b) {
        if(a<=st && dr<=b) {
            sol+=v[nod];
            // cout<<st<<" "<<dr<<" "<<v[nod]<<endl;
        }
        else {
            int mid=(st+dr)/2;
            if(a<=mid) {
                range(2*nod, st, mid, a, b);
            }
            if(b>=mid+1) {
                range(2*nod+1, mid+1, dr, a, b);
            }
        }
    }
} aint;

void solve() {
    int c, x, y;
    for(int i=1;i<=q;i++) {
        fein>>c>>x>>y;
        if(c==1) {
            sol=0;
            aint.range(1, 1, n, x, y);
            cout<<endl;
            g<<sol<<'\n';
        }
        else {
            aint.subtract(1, 1, n, x, y);
        }
    }
}

void read_data() {
    fein>>n>>q;
    for(int i=1;i<=n;i++) {
        fein>>a[i];
    }
}

int main()
{
    read_data();
    aint.init();
    aint.build(1, 1, n);
    solve();
    return 0;
}