Cod sursa(job #3134326)

Utilizator CiprianHutanuHutanu Ciprian CiprianHutanu Data 28 mai 2023 21:20:55
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#include <iostream>
#include <vector>

std::ifstream in;
std::ofstream out;

class AINT{
    std::vector<int> v;
    int sum;
public:
    AINT(){
        v.resize(400005);
        sum = 0;
    }
    void update(int, int, int, int, int);
    void query(int, int, int, int, int);
    void pay(int, int, int, int, int);
    void resetMax(){
        sum = 0;
    }
    int getMax(){
        return sum;
    }
};

void AINT::update(int node, int left, int right, int pos, int x) {
    if(left == right){
        v[node] = x;
        return;
    }
    else{
        int mid = (left + right) / 2;
        if(pos <= mid){
            update(2*node, left, mid, pos, x);
        }
        else{
            update(2*node + 1, mid + 1, right, pos, x);
        }
        v[node] = v[2*node] + v[2*node+1];
    }
}

void AINT::query(int node, int left, int right, int a, int b) {
    if(a<=left and right<=b){
        sum += v[node];
        return;
    }
    else{
        int mid = (left + right) / 2;
        if(a <= mid)
            query(2*node, left, mid, a, b);
        if(b > mid)
            query(2*node + 1, mid + 1, right, a, b);
    }
}

void AINT::pay(int node, int left, int right, int pos, int x) {
    if(left == right){
        v[node] -= x;
        return;
    }
    else{
        int mid = (left + right) / 2;
        if(pos <= mid){
            pay(2*node, left, mid, pos, x);
        }
        else{
            pay(2*node + 1, mid + 1, right, pos, x);
        }
        v[node] = v[2*node] + v[2*node+1];
    }
}


int main() {
    int n, i , m, op, a, b, x;
    in.open("datorii.in");

    in>>n>>m;
    AINT aint;
    for(i=0;i<n;i++){
        in>>x;
        aint.update(1, 1, n, i + 1  , x);
    }
    out.open("datorii.out");

    for(i = 0; i < m; i++){
        in>>op>>a>>b;
        if(op == 1){
            aint.resetMax();
            aint.query(1,1,n,a,b);
            out<<aint.getMax() << '\n';
        }
        else{
            aint.pay(1,1,n,a,b);
        }
    }

    in.close();
    out.close();

    return 0;
}