Cod sursa(job #3222456)

Utilizator cosmin_mihaiDumitru Cosmin cosmin_mihai Data 10 aprilie 2024 11:04:30
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

const int N = 15000;
const int L = 17;

ifstream fin("datorii.in");
ofstream fout ("datorii.out");

class BIT {
private:
    vector<int> bit;

public:
    BIT(int size=0) : bit(size+1,0){};

    void resize(int size){
        bit.resize(size+1);
    };

    void display(){
        for (size_t i = 0; i <bit.size(); i++){
            cout << bit[i] << ' ';
        }
        cout << '\n';
    }

    void update(int index,int value){
        index++;
        while (index < bit.size()){
            bit[index] +=value;
            index+= index & (-index);
        }
    }

    int query(int index){
        int sum = 0;
        while (index>0){
            sum+=bit[index];
            index -= index & (-index);
        }
        return sum;
    }

    int two_point_query(int st,int dr){
        return query(dr)-query(st);
    }

    int get(int index){
        return bit[index];
    }
};

vector<int> v;
int n,k;

int main(){
    fin >> n >> k;
    v.resize(n);
    BIT bit;
    bit.resize(n);
    for (int i = 0; i <n; ++i) {
        fin >> v[i];
    }
    for (int i = 0; i <n; ++i) {
        bit.update(i,v[i]);
    }
    bit.display();
    for (int i = 0; i <k; ++i) {
        int tip;
        fin >> tip;
        if (!tip){
            int poz,val;
            fin >> poz >> val;
            bit.update(poz-1,(-1)*val);
        }else{
            int a,b;
            fin >> a >>b;
            fout << bit.two_point_query(a-1,b)<<'\n';
        }
    }
    bit.display();
    
    return 0;
}