Cod sursa(job #2418369)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 4 mai 2019 19:02:08
Problema Datorii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <bits/stdc++.h>
#define NMAX 15009
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int a[4*NMAX];
int n,m;
int v[NMAX];
void citire();
void build (int node, int st, int dr);
void update(int node, int st, int dr, int x, int val);
int  query(int node, int st, int dr, int x, int y);
int main()
{citire();
 build(1,1,n);
 for(int i=1;i<=m;i++)
    {
     int x,y,c;
     fin>>c>>x>>y;
     if(!c)
        {
         update(1,1,n,x,-y);
        }
        else
            fout<<query(1,1,n,x,y)<<'\n';
    }
    return 0;
}
void citire()
{
  int i;
  fin>>n>>m;
  for(i=1;i<=n;i++)
        fin>>v[i];
}
void build(int node, int st, int dr)
{
 int mj=(st+dr)/2;
 if(st==dr)
        {a[node]=v[st];return;}
    build(2*node,st,mj);
    build(2*node+1,mj+1,dr);
    a[node]=a[2*node]+a[2*node+1];
}
void update(int node,int st, int dr, int x, int val)
{
  int mj=(st+dr)/2;
   if(st==dr)
    {
     a[node]+=val;
     return;
    }
   if(x<=mj)
      update(2*node,st,mj,x,val);

   if(x>mj)
      update(2*node+1,mj+1,dr,x,val);
    a[node]=a[2*node]+a[2*node+1];
}
int  query(int node, int st, int dr, int x, int y)
{  int ans1=0;int ans2=0;
  int mj=(st+dr)/2;
  if(x<=st && dr<=y)
      return a[node];
  if(x<=mj)
    ans1=query(2*node,st,mj,x,y);

  if(y>mj)
    ans2=query(2*node+1,mj+1,dr,x,y);
    return ans1+ans2;
}