Cod sursa(job #3367859)

Utilizator Lapush05alexandru Lapush05 Data 11 octombrie 2026 14:45:25
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>
using namespace std;
 const int nm=1e5;
 int v[nm+1];
 int aint[4*nm+1];

 void build(int nod, int st, int dr)
 {
     if(st==dr)
     {
         aint[nod] = v[st];
     }
     else
     {
         int mid=(st+dr)/2;
         build(2* nod, st, mid);
         build(2*nod+1, mid+1, dr);
         aint[nod]=aint[2*nod] + aint[2*nod+1];
     }
 }

 void update(int nod, int st, int dr, int pos, int val)
 {
     if(st==dr)
     {
         aint[nod]-=val;

     }
     else
     {
         int mid =(st+dr)/2;
         if(pos <=mid)
         {
             update(2* nod, st, mid, pos, val);

         }
         else
         {
             update(2*nod +1, mid+1, dr, pos, val);
         }
         aint[nod]=aint[2*nod]+aint[2*nod+1];
     }
 }

 int query(int nod, int st, int dr, int x, int y)
 {
     if(x<=st && dr<=y)
     {
         return aint[nod];
     }
     else
     {
         int mid =(st+dr)/2;
         int L=0, R=0;
         if(x<=mid)
         {
             L=query(2*nod, st, mid, x, y);
         }
         if(mid+1<=y)
         {
             R= query(2*nod +1, mid+1, dr, x,y);
         }
         return L+R;
     }
 }



int main() {
    ifstream cin("datorii.in");
    ofstream cout("datorii.out");
    int n, m;
    cin >> n >> m;
    for (int i=1; i<=n; i++)
    {
        cin >> v[i];
    }
    build(1,1,n);
    for(int i=1; i<=m; i++)
    {
        int op, x, y;
        cin >> op >> x >> y;
        if(op==0)
        {
            update(1,1,n,x,y);
        }
        else  cout << query(1,1,n, x,y) << '\n';

    }


   return 0;
}