Cod sursa(job #3158695)

Utilizator Laurentiu_BTarabic Laurentiu Gabriel Laurentiu_B Data 19 octombrie 2023 17:40:50
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<iostream>
#include<fstream>
using namespace std;
int sizes,m,aint[400001],a[400001];
void init(int n,int l,int r)
{
 if(l==r)
    aint[n]=a[l];
 else
 {
   int m=(l+r)/2;
   init(n*2,l,m);
   init(n*2+1,m+1,r);
   aint[n]=aint[n*2]+aint[n*2+1];
 }
}
void update(int n,int l,int r,int p,int v)
{
  if(l==r)
      aint[n]-=v;
  else
  {
      int m=(l+r)/2;
      if(p<=m)
      {
        update(n*2,l,m,p,v);
        aint[n]=aint[n*2]+aint[n*2+1];
      }
      else
      {
         update(n*2+1,m+1,r,p,v);
         aint[n]=aint[n*2+1]+aint[n*2];
      }
  }
}

int finde(int n,int l,int r,int pl,int pr)
{
    if(l==r)
        return aint[n];
    int m=(l+r)/2;
     if(pl<=l&&pr>=r)
     {
         return aint[n];
     }
     else
     {
         int ma=0;
      if(pl<=m)
      {
       ma=finde(n*2,l,m,pl,pr);
      }
      if(pr>=m)
      {
          ma=ma+finde(n*2+1,m+1,r,pl,pr);
      }
      return ma;
     }
}

int main()
{
    ifstream f("datorii.in");
    ofstream g("datorii.out");
    f>>sizes>>m;
    for(int i=1;i<=sizes;i++)
        f>>a[i];
    init(1,1,sizes);
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        f>>z>>x>>y;
        if(z==0)
            update(1,1,sizes,x,y);
        else
            g<<finde(1,1,sizes,x,y)<<endl;
    }
}