Cod sursa(job #3291223)

Utilizator Daniel_TTudor Daniel Andrei Daniel_T Data 3 aprilie 2025 19:08:20
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 15000;
int a[NMAX + 5], sp[NMAX + 5], aib[NMAX + 5];

long long pow(int b, int e){
    int p = 1;
    for(int bit = 1; bit <= e; bit <<= 1){
        if(e & bit)
            p *= b;
        b *= b;
        e >> 1;
    }
    return p;
}

void readData(int n){
    for(int i = 1; i <= n; i++){
        fin >> a[i];
        sp[i] = a[i] + sp[i - 1];
    }
}

void initAIB(int n){
    for(int i = 1; i <= n; i++){
        if(i & 1)
            aib[i] = a[i];
        else{
            aib[i] = sp[i] -  sp[i - (i & (-i))];
        }
    }
}

void update(int poz, int val, int n){
    for(int i = poz; i <= n; i += i & (-i))
        aib[i] -= val;
}

long long query(int poz){
    long long s;

    s = 0;

    for(int i = poz; i > 0; i -= i & (-i))
        s += aib[i];

    return s;
}

int main()
{
    int n, m;

    fin >> n >> m;

    readData(n);
    initAIB(n);


    for(int i = 1; i <= m; i++){
        int q;
        fin >> q;

        if(q == 0){
            int t, v;
            fin >> t >> v;
            update(t, v, n);
        }
        if(q == 1){
            int p, q;
            fin >> p >> q;
            fout << query(q) - query(p - 1) << "\n";
        }
    }


    fin.close();
    fout.close();
    return 0;
}