Cod sursa(job #3173390)

Utilizator DomnulMilandruMilandru Nicon-David DomnulMilandru Data 22 noiembrie 2023 19:18:32
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb

#include <fstream>
#include <vector>
using namespace std;
ifstream cin("datorii.in");
ofstream cout("datorii.out");
int n,m,x;
vector<int> A;
void update1(int nod,int st,int dr,int poz,int a)
{
    if(st==dr)
      A[nod]=A[nod]+a;
    else
     {
         int mij=st+(dr-st)/2;
         if(poz<=mij)
           update1(2*nod,st,mij,poz,a);
         else
          update1(2*nod+1,mij+1,dr,poz,a);
          A[nod]=A[2*nod]+A[2*nod+1];
     }
}
void update2(int nod,int st,int dr,int poz,int a)
{
    if(st==dr)
     A[nod]=A[nod]-a;
    else
     {
         int mij=st+(dr-st)/2;
         if(poz<=mij)
           update2(2*nod,st,mij,poz,a);
         else
          update2(2*nod+1,mij+1,dr,poz,a);
        A[nod]=A[2*nod]+A[2*nod+1];
     }
}
int query(int st,int dr,int a,int b,int nod)
{
    if(b<st || dr<a)
      return 0;
    else
     if(a<=st && dr<=b)
        return A[nod];
    else
     {
         int mij=st+(dr-st)/2;
         return query(st,mij,a,b,2*nod)+query(mij+1,dr,a,b,2*nod+1);
     }

}
int t,a,b;
int main()
{
    cin>>n>>m;
    A.resize(4*n+1);
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        update1(1,1,n,i,x);
    }
    for(int i=0;i<m;i++)
    {
       cin>>t;
       cin>>a>>b;
       switch (t)
       {
           case 0:
           {
               update2(1,1,n,a,b);
               break;
           }
           case 1:
           {
               cout<<query(1,n,a,b,1)<<'\n';
           }
       }
    }
    return 0;
}