Cod sursa(job #2281505)

Utilizator mpavel77Pavel Mihai mpavel77 Data 12 noiembrie 2018 13:23:32
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <iostream>
#include <assert.h>
#include<fstream>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
#define dim 15001
int n, m;

int suma_arb[4*dim+66];

int start, finish, val, pos, suma;
void update(int nod,int left,int right)
{
  if (left==right)
  {
    if (suma_arb[nod]>0)
    suma_arb[nod]=suma_arb[nod]-val;
    else
    suma_arb[nod]=val;
  return;
  }
  int div=(left+right)/2;
  if (pos<=div)
  update(nod*2,left,div);
  else
  update(nod*2+1,div+1,right);
  suma_arb[nod]=suma_arb[2*nod]+suma_arb[2*nod+1];
}
void query(int nod,int left,int right)
{
  if (left==right)
  {
    suma=suma+suma_arb[nod];
  return;
  }
if ((start<=left)&&(right<=finish))
{
  suma=suma+suma_arb[nod];
  return;
}
int div=(left+right)/2;
if (start<=div)
query(2*nod,left,div);
if (finish>div)
query(2*nod+1,div+1,right);
}
int main()
{
  int x,c,t,v;
    f>>n>>m;
    for (int i=1;i<=n;i++)
    {
      f>>x;
       pos = i, val = x;

        update(1,1,n);
    }
    for (int i=1;i<=m;i++)
    {
      f>>c>>t>>v;
      if (c==1)
      {
        start=t; finish=v;
        suma=0;
        query(1,1,n);
        g<<suma<<'\n';
      }else
      {
        pos=t;
        val=v;
        update(1,1,n);}
    }
    return 0;
}