Cod sursa(job #2300932)

Utilizator ValentinSavoiuFMI Savoiu Valentin-Marian ValentinSavoiu Data 12 decembrie 2018 13:04:11
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#define dim 15001
using namespace std;

ifstream f ("datorii.in");
ofstream g ("datorii.out");

int tree[4 * dim + 13];
int N, M;
long long sum;
void Update(int nod, int currL, int currR, int pos, int val) {
     if ( currL == currR ) {
          tree[nod] -= val;
          return;
     }

     int mid = currL + (currR - currL) / 2;
     if ( pos <= mid ) Update(2 * nod, currL, mid, pos, val);
     else              Update(2 * nod + 1, mid + 1, currR, pos, val);

     tree[nod] = tree[2 * nod] + tree[2 * nod + 1];
}

void Query(int nod, int currL, int currR, int queL, int queR) {
     if ( queL <= currL && currR <= queR ) {
          sum += tree[nod];
          return;
     }

     int mid = currL + (currR - currL) / 2;
     if ( queL <= mid ) Query(2 * nod, currL , mid, queL, queR);
     if ( mid < queR ) Query(2 * nod + 1, mid + 1, currR, queL, queR);
}
int main() {
    int x, a, b;
    f >> N >> M;
    for (int i = 1; i <= N; i++) {
        f >> x;
        Update(1, 1, N, i, -x);
    }

    for ( int i = 1; i <= M; i++ ) {
        f >> x >> a >> b;
        if ( x == 1 ) {
             sum = 0;
             Query(1, 1, N, a, b);
             g << sum << '\n';
        }
        else    Update(1, 1, N, a, b);

    }
}