Cod sursa(job #2421799)

Utilizator Iancu_StefanIancu Stefan Iancu_Stefan Data 16 mai 2019 10:28:37
Problema Datorii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <bits/stdc++.h>
#define MAX 15005

using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n,m;
int preturi[MAX],arb[4*MAX];

int build(int nod,int st,int dr);
int suma(int nod,int st,int dr,int a,int b);
void update(int nod,int st,int dr,int poz,int val);

int main()
{
 int i,op,a,b;
 fin>>n>>m;
 for (i=1;i<=n;i++)
    fin>>preturi[i];
 build(1,1,n);
 for(i=1;i<=m;i++)
 {
  fin>>op>>a>>b;
  if (op==1)
      {
       fout<<suma(1,1,n,a,b)<<'\n';
      }
      else update(1,1,n,a,b);
 }
return 0;
}
int build(int nod,int st,int dr)
{
 int s=0;
 if (dr==st)
      {
       arb[nod]=preturi[dr];
       return arb[nod];
      }
 int mij=(st+dr)/2;
 s+=build(nod*2,st,mij);
 s+=build(nod*2+1,mij+1,dr);
 arb[nod]=s;
 return s;

}
int suma(int nod,int st,int dr,int a,int b)
{
 int s=0;
 if (st>=a&&dr<=b)
    return arb[nod];
 if (dr<a||b<st) return 0;
 int mij=(st+dr)/2;
 s+=suma(2*nod,st,mij,a,b);
 s+=suma(2*nod+1,mij+1,dr,a,b);
 return s;
}
void update(int nod,int st,int dr,int poz,int val)
{
 if (st==dr)
     {
      arb[nod]-=val;
      return;
     }
int  mij=(st+dr)/2;
 if (poz<=mij)
 update(nod*2,st,mij,poz,val);
 else
    update(nod*2+1,mij+1,dr,poz,val);
 arb[nod]-=val;
}