Cod sursa(job #1908247)

Utilizator M.AndreiMuntea Andrei Marius M.Andrei Data 6 martie 2017 23:51:31
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
using namespace std;

ifstream f{ "datorii.in" };
ofstream q{ "datorii.out" };

int arb[15010 * 4];
int n, m;

void update(int node, int start, int end, int left, int right, int val)
{
   if (start > end || start > right || left > end) return;

   if (left <= start && end <= right)
   {
      arb[node] -= val;
      return;
   }

   int mid = (start + end) / 2;
   update(node * 2, start, mid, left, right, val);
   update(node * 2 + 1, mid + 1, end, left, right, val);
   arb[node] = arb[node * 2] + arb[node * 2 + 1];
}

int query(int node, int start, int end, int left, int right)
{
   if (start > end || start > right || left > end) return 0;

   if (left <= start && end <= right)
   {
      return arb[node];
   }

   int mid = (start + end) / 2;
   int leftSum = query(node * 2, start, mid, left, right);
   int rightSum = query(node * 2 + 1, mid + 1, end, left, right);
   return leftSum + rightSum;

}

int main()
{
   f >> n >> m;
   
   int x, a, b, op;

   for(int i = 1; i <= n; ++i)
   {
      f >> x;
      update(1, 1, n, i, i, -x);
   }

   for(;m--;)
   {
      f >> op >> a >> b;
      if (op == 0) update(1, 1, n, a, a, b);
      else q << query(1, 1, n, a, b)<<"\n";
   }

   
   f.close();
   q.close();
   return 0;
}