Cod sursa(job #3362949)

Utilizator CorvinJudge0Corvin Judge CorvinJudge0 Data 13 august 2026 10:35:41
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

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

int v[200001];
vector <int> segtree(400001);
int n,m;

void build(int node) {
    if (node>=n) segtree[node]=v[node-n+1];
    else {
        build(node*2);
        build(node*2+1);
        segtree[node]=segtree[node*2]+segtree[node*2+1];
    }
}

void update(int a,int b) {
    v[a]-=b;
    a+=n-1;
    segtree[a]-=b;
    a/=2;
    while (a>=1) {
        segtree[a]-=b;
        a/=2;
    }
}

int query(int a, int b, int start, int end, int node) {
    int rasp=0;
    int mij=(start+end)/2;
    if (a<=start && end<=b) {
        rasp+=segtree[node];
        return rasp;
    }
    if (a<=mij) {
        rasp+=query(a,b,start,mij,2*node);
    }
    if (b>mij) {
        rasp+=query(a,b,mij+1,end,2*node+1);
    }
    return rasp;
}

int main() {
    fin>>n>>m;
    for (int i=1;i<=n;i++) {
        fin >> v[i];
    }

    int aux=log2(n);
    n=pow(2,(aux+1));
    build(1);

    for (int i=1;i<=m;i++) {
        int cer,a,b;
        fin >> cer >> a >> b;
        if (cer==1) {
            fout << query(a,b,1,n,1) << "\n";
        }else {
            update(a,b);
        }
    }
    return 0;
}