Cod sursa(job #2761308)

Utilizator Virgil993Virgil Turcu Virgil993 Data 1 iulie 2021 16:18:27
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <iostream>
#include<bits/stdc++.h>

using namespace std;

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

int arb[100000],v[15005];

void creare_arbore(int nod, int st, int dr)
{
    if(st==dr)
    {
        arb[nod]= v[st];
    }
    else
    {
        int mij = (st+dr)/2;
        creare_arbore(nod*2,st,mij);
        creare_arbore(nod*2+1,mij+1,dr);
        arb[nod] = arb[nod*2]+arb[nod*2+1];
    }
}

int interogare(int nod, int st, int dr, int start, int finish)
{
    if(start<=st&&finish>=dr)
    {
        return arb[nod];
    }
    else
    {
        int s1=0,s2=0;
        int mij=(st+dr)/2;
        if(start<=mij)
            s1 = interogare(nod*2,st,mij,start,finish);
        if(finish>mij)
            s2 = interogare(nod*2+1,mij+1,dr,start,finish);
        s1 = s1+s2;
        return s1;
    }
}

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


int main()
{
    int n,m,comanda,prim,sec;
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];

    creare_arbore(1,1,n);
    for(int i=0;i<m;i++)
    {
        fin>>comanda;
        if(comanda==1)
        {
            fin>>prim>>sec;
            fout<<interogare(1,1,n,prim,sec)<<"\n";
        }
        else
        {
            fin>>prim>>sec;
            update(1,1,n,prim,sec);
        }
    }



    return 0;
}