Cod sursa(job #2889954)

Utilizator AdrianDiaconitaAdrian Diaconita AdrianDiaconita Data 13 aprilie 2022 22:15:57
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 15001;
int N,M, A[NMAX], aint[4*NMAX], res = 0;

void init(int nod, int st, int dr)
{
  if(st==dr)
    aint[nod]=A[st];
  else
  {
    int m = (st+dr)/2;
    init(2*nod, st, m);
    init(2*nod+1, m+1, dr);
    aint[nod]=aint[2*nod]+aint[2*nod+1];
  }
}

void update(int nod, int st, int dr, int poz, int sum)
{
  if(st==dr)
    aint[nod] -= sum;
  else
  {
    int m = (st+dr)/2;
    if(poz<=m)
      update(2*nod, st, m, poz, sum);
    else
      update(2*nod+1, m+1, dr, poz, sum);
 
    aint[nod] = aint[2*nod] + aint[2*nod+1];
  }
}

void query(int nod, int st, int dr, int S, int D)
{
  if(st>=S && dr<=D)
  {
    res+=aint[nod];
    return;
  }
  else
  {
    int m = (st+dr)/2;
    if(S<=m)
      query(2*nod, st, m, S, D);
    if(D>m)
      query(2*nod+1, m+1, dr, S, D);
  }
}

int main ()
{
    fin >> N >> M;
    for (int i = 1; i <= N; ++i)
    {
        fin >> A[i];
    }
    init(1,1,N);
    for(int i=1; i <= M; ++i)
    {
        int t, a, b;
        fin>>t>>a>>b;
        if(t)
        {
            query(1,1,N,a,b);
            fout<<res<<'\n';
            res=0;
        }
        else
            update(1,1,N,a,b);
    }
}