Cod sursa(job #1850925)

Utilizator NarniussAnghelache Bogdan Narniuss Data 19 ianuarie 2017 01:28:00
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

#define NMAX 15100
#define arbmax 1 << 19
#define left(x) ((x) << 1)  //stanga unui nod
#define right(x) ((x) << 1) + 1 //dreapta unui nod

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

int arbint[arbmax],v[NMAX];

void creare(int nod, int left, int right)
{
  if(left == right){
    arbint[nod] = v[left];
  }else{
  int mid = (right+left) >> 1;

  creare(left(nod), left, mid);
  creare(right(nod), mid + 1, right);

  arbint[nod] = arbint[left(nod)] + arbint[right(nod)];
}
}
void update(int nod, int left, int right, int poz, int val)
{
  if( left == right){
    arbint[nod] -= val;
    return;
  }

  int mid =  (right + left) >> 1;

  if(poz <= mid){
    update(left(nod), left, mid, poz, val);
  }
  else{
    update(right(nod), mid + 1, right, poz, val);
  }

  arbint[nod] -= val;
}

int query(int nod, int left, int right, int st_q, int dr_q)
{
  if(st_q <= left && right <= dr_q)
    return arbint[nod];
  int mid = ( left + right ) >> 1;
  int t1 = 0, t2 = 0;


    if (st_q <= mid)
        t1 = query(left(nod), left , mid, st_q, dr_q);
    if (dr_q > mid)
        t2 = query(right(nod), mid + 1, right , st_q, dr_q);

    return t1+t2;
}

int main() {

    int n,i , m, x, y, t;


    fin >> n >> m;

    for (i = 1; i <= n; ++i) {
      fin>>v[i];
    }
    creare(1,1,n);

    for(i = 1 ; i <= m  ; i++) {

        fin >> t >> x >> y;

        if (t == 0)
            update(1,1,n,x,y);
        else{
          fout<<query(1, 1, n, x, y)<< "\n";
        }

    }

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