Cod sursa(job #2611070)

Utilizator AnastasiaStefanescuAnastasia Stefanescu AnastasiaStefanescu Data 6 mai 2020 12:08:46
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <math.h>

#include <fstream>
#include <algorithm>
using namespace std;

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

int aint[60005];
int A[15001];

void build(int nod,int st,int dr)
{
  if(st>dr)
    return;
  if(st==dr){
    aint[nod]=A[st];
    return;
  }
  int mijl=(st+dr)/2;
  build(2*nod,st,mijl);
  build(2*nod+1,mijl+1,dr);
  aint[nod]=aint[2*nod] + aint[2*nod+1];
}

void update(int nod,int st,int dr,int poz,int val)
{
  if(st>dr || poz>dr || poz<st)
    return;
  if(st==dr){
    aint[nod] -= val;
    return;
  }
  int mijl=(st+dr)/2;
  update(2*nod,st,mijl,poz,val);
  update(2*nod+1,mijl+1,dr,poz,val);
  aint[nod]=aint[2*nod] + aint[2*nod+1];
}

int query(int nod,int st,int dr,int qst,int qdr)
{
    int suma_restanta, q1, q2;
  if(st>dr || st>qdr || dr<qst)
    return 0;
  if(qst<=st && dr<=qdr)
    return aint[nod];
  int mid=(st+dr)/2;
    q1 = query(2*nod,st,mid,qst,qdr);
    q2 = query(2*nod+1,mid+1,dr,qst,qdr);
  suma_restanta = q1 + q2;
  return suma_restanta;
}
int n,m,x,y,c;
int main()
{
    int i;
    
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>A[i];
    
    build(1,1,n);
    
    for(i=1;i<=m;i++)
    {
        fin>>c>>x>>y;
        if(c==1)
            fout<<query(1,1,n,x,y)<<"\n";
        else
            update(1, 1, n, x, y);
    }
    

return 0;
}