Cod sursa(job #2816686)

Utilizator Antonia_onisoruantonia onisoru Antonia_onisoru Data 11 decembrie 2021 21:23:09
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <iostream>
#include <fstream>
#include <stdio.h>

using namespace std;

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

const int MAXN = 15000;
const int MAXA = MAXN * 2;

int a[MAXA];
int v[MAXN];

void contructArbore( int left, int right, int nodeIndex ){
  if( left == right ){
    a[nodeIndex] = v[left];
    return;
  }

  int mid, leftChild, rightChild;
  mid = ( right + left ) / 2;
  leftChild = nodeIndex + 1;
  rightChild = nodeIndex + ( mid  + left + 1 ) * 2;

  contructArbore(left, mid, leftChild);
  contructArbore(mid + 1, right, rightChild);

  a[nodeIndex] = a[leftChild] + a[rightChild];
}

void update( int nodeIndex, int left, int right, int poz, int val ){
  if( left == right ){
    a[nodeIndex] -= val;
    return;
  }

  int mid, leftChild, rightChild;
  mid = ( left + right ) / 2;
  leftChild = nodeIndex + 1;
  rightChild = nodeIndex + ( mid + left + 1 ) * 2;

  if( poz <= mid )
    update( leftChild, left, mid, poz, val );
  else
    update( rightChild, mid + 1, right, poz, val );

  a[nodeIndex] = a[leftChild] + a[rightChild];
}

int query( int nodeIndex, int left, int right, int index1, int index2 ){
  if( left >= index1 && index2 >= right ){
    return a[nodeIndex];
  }

  int mid, leftChild, rightChild;
  mid = ( left + right ) / 2;
  leftChild = nodeIndex + 1;
  rightChild = nodeIndex + ( mid + left + 1 ) * 2;

  int sum;
  sum = 0;

  if( index1 <= mid )
    sum += query(leftChild, left, mid, index1, index2);
  if( index2 > mid )
    sum += query(rightChild, mid + 1, right, index1, index2);

  return sum;
}

int main(){
  int n, m, i, c, a, b;
  in>>n>>m;
  for( i = 0; i < n; i++ ){
    in>>v[i];
  }

  contructArbore(0, n - 1, 0);

  for( i = 0; i < m; i++ ){
    in>>c>>a>>b;

    if( c == 0 ){
      update(0, 0, n - 1, a - 1, b);
    }
    else{
      out<<query(0, 0, n - 1, a - 1, b - 1)<<'\n';
    }
  }
  return 0;
}