Cod sursa(job #2708976)

Utilizator grigorut_octavianGrigorut Dominic Octavian grigorut_octavian Data 19 februarie 2021 16:49:41
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <iostream>
#include <fstream>

#define mac 400001

using namespace std;

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



int tree[mac],v[mac];
int n,k;

void build(int nod, int st,int dr)
{
    if(st==dr)
    {
        tree[nod]=v[st];
        return ;
    }
    int mij=(st+dr)/2;
    build(2*nod,st,mij);
    build(2*nod+1,mij+1,dr);
    tree[nod]=tree[2*nod]+tree[2*nod+1];
}

void update(int nod, int poz, int st, int dr, int val)
{
    if(st==dr)
    {
        tree[nod]=tree[nod]-val;
        return ;
    }

    int mij = (st+dr)/2;
    if(poz>mij)
    {
        update(2*nod+1,poz,mij+1,dr,val);
    }
    else update(2*nod,poz,st,mij,val);

    tree[nod]=tree[2*nod]+tree[2*nod+1];
}

int query(int nod, int x,int y, int st,int dr)
{
   if(x<=st and y>=dr)
   {
       return tree[nod];
   }
   int mij=(st+dr)/2;
   int ans1=0,ans2=0;
   if(x<=mij)
   {
       ans1=query(2*nod,x,y,st,mij);
   }
   if(y>mij) ans2=query(2*nod+1,x,y,mij+1,dr);
   return ans1+ans2;
}

void read()
{
    fin>>n>>k;
    for(int i=1;i<=n;i++) fin>>v[i];

    build(1,1,n);
    for(int i=1;i<=k;i++)
    {
        int t,x,y;
        fin>>t>>x>>y;
        if(t==1)
        {
            fout<<query(1,x,y,1,n)<<'\n';
        } else update(1,x,1,n,y);
    }
}

int main()
{
    read();
    return 0;
}