Cod sursa(job #3337612)

Utilizator MrPetcuPetcu Robert MrPetcu Data 29 ianuarie 2026 10:10:58
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>

using namespace std;

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

int a_int[1000000+5];
int num_zile, num_queries;
int valoare;
bool tip_query;
int x, y;

void update(int pozitie, int valoare, int nod = 1, int st = 1, int dr = num_zile){
    if(st == dr){
        a_int[nod] -= valoare;
        return;
    }
    int mijloc = (st + dr) / 2;
    if(pozitie <= mijloc){
        update(pozitie, valoare, nod * 2, st, mijloc);
    }
    else{
        update(pozitie, valoare, nod * 2 + 1, mijloc + 1, dr);
    }
    a_int[nod] = a_int[nod * 2] + a_int[nod * 2 + 1];
}

int query(int st_prim, int dr_prim, int nod = 1, int st = 1, int dr = num_zile){
    if(st_prim <= st && dr <= dr_prim){
        return a_int[nod];
    }
    int mijloc = (st + dr) / 2;
    int suma = 0;
    if(st_prim <= mijloc){
        suma += query(st_prim, dr_prim, nod * 2, st, mijloc);
    }
    if(dr_prim > mijloc){
        suma += query(st_prim, dr_prim, nod * 2 + 1, mijloc + 1, dr);
    }
    return suma;
}

int main(){
    fin >> num_zile >> num_queries;
    for(int i = 1; i <= num_zile; i++){
        fin >> valoare;
        update(i, -valoare);
    }
    for(int i = 1; i <= num_queries; i++){
        fin >> tip_query >> x >> y;
        if(tip_query == 0){
            update(x, y);
        }
        else if(tip_query == 1){
            fout << query(x, y) << '\n';
        }
    }
    return 0;
}