Cod sursa(job #2515697)

Utilizator YetoAdrian Tonica Yeto Data 29 decembrie 2019 12:49:47
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#define dim 15001
using namespace std;
int v[dim], A[4*dim+66];
int n, m, i, j, a, b, sol, t;
ifstream fin ("datorii.in");
ofstream fout ("datorii.out");

void build (int nod, int st, int dr)
{
    int mid;
    if (st==dr) {
        A[nod]=v[st];
    } else {
        mid = st+(dr-st)/2;
        build(2*nod, st, mid);
        build(2*nod+1, mid+1, dr);
        A[nod]=A[2*nod]+A[2*nod+1];
    }
}

void update (int nod, int st, int dr, int p, int x)
{
    int mid;
    if (st==dr) {
        A[nod]-=x;
    } else {
        mid = (st+dr)/2;
        if (p<=mid)
            update (2*nod, st, mid, p, x);
        else
            update (2*nod+1, mid+1, dr, p, x);
        A[nod]=A[2*nod]+A[2*nod+1];
    }
}

void query(int nod, int st, int dr, int a, int b, int &sol)
{
    int mid;
    if (a<=st && b>=dr) {
        sol+=A[nod];
    } else {
        mid = (st+dr)/2;
        if (a<=mid)
            query(2*nod, st, mid, a, b, sol);
        if (b>mid)
            query(2*nod+1, mid+1, dr, a, b, sol);
    }
}

int main () {
    fin>>n>>m;
    for (i=1;i<=n;i++)
        fin>>v[i];
    build (1, 1, n);
    for (i=1;i<=m;i++) {
        fin>>t>>a>>b;
        if (t==0) {
            update (1, 1, n, a, b);
        } else {
            sol=0;
            query(1, 1, n, a, b, sol);
            fout<<sol<<"\n";
        }
    }
    return 0;
}