Cod sursa(job #1996098)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 30 iunie 2017 08:14:38
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, m;
int arbore[400000];
bool ok ;

void actualizare(int pozNod, int stInter, int drInter, int poz, int val){
  if(stInter == drInter){
    if(ok == false)
      arbore[pozNod] = val;
    else
      arbore[pozNod] -= val;
    return ;
  }
  int mijloc = (stInter + drInter) / 2;
  if(poz <= mijloc)
    actualizare(pozNod * 2, stInter, mijloc, poz, val);
  else
    actualizare(pozNod * 2 + 1, mijloc + 1, drInter, poz, val);//ca esti in dr
  arbore[pozNod] = arbore[2 * pozNod] + arbore[2 * pozNod + 1];
}

int raspuns = 0;

void intervale(int pozNod, int stInter, int drInter, int a, int b){
  if(a <= stInter && drInter <= b){
    raspuns = raspuns + arbore[pozNod];
  }
  else{
    int mijloc = ( stInter + drInter ) / 2;
    if(a <= mijloc)//extremele
      intervale(pozNod * 2, stInter, mijloc, a, b);
    if(b > mijloc)
      intervale(pozNod * 2 + 1, mijloc + 1, drInter, a, b);
  }
}

void citire(){
  in >> n >> m;
  ok = false;
  for(int i = 1; i<= n; i++){
    int temp;
    in >> temp;
    actualizare(1, 1, n, i, temp);
    //pun in arbore care are in nodul 1, intervalul de la 1 la n , pe pozitia i, temp
  }
  ok = true;
  for(int i = 1; i <= m; i++){
    int t, a, b;
    in >> t >> a >> b;
    if(t == 0){
      actualizare(1, 1, n, a, b);
    }
    else{
      raspuns = 0;
      intervale(1, 1, n, a, b);
      out << raspuns << '\n';
    }
  }
}

int main(){
  citire();
  return 0;
}