Cod sursa(job #2030855)

Utilizator rangal3Tudor Anastasiei rangal3 Data 2 octombrie 2017 12:56:29
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#define in "aib.in"
#define out "aib.out"
#define N 100003

using namespace std;

ifstream fin(in);
ofstream fout(out);

int n,m,val,poz,heap[4*N];

inline void actualizare(int nod,int st,int dr)
{
    if(st == dr)
    {
        heap[nod] += val;
    }
    else
    {
        int mij = (st+dr)/2;

        if(poz <=mij) actualizare(nod*2,st,mij);
        if(poz > mij) actualizare(nod*2+1,mij+1,dr);

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

inline int suma(const int &nod,const int &a,const int &b,int st,int dr)
{
    if(st>=a && dr<=b) return heap[nod];
    else
    {
        int S = 0;
        const int mij = (st+dr)/2;
        if(a <= mij) S += suma(2*nod,a,b,st,mij);
        if(mij < b) S += suma(2*nod+1,a,b,mij+1,dr);
        return S;
    }
}

int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; ++i)
    {
        fin>>val;
        poz = i;
        actualizare(1,1,n);
    }

    int p,a,b;

    while(m--)
    {
        fin>>p;
        if(p == 0)
        {
            fin>>a>>b;
            poz = a;
            val = b;
            actualizare(1,1,n);
        }
        else if(p == 1)
        {
            fin>>a>>b;
            fout<<suma(1,a,b,1,n)<<"\n";
        }
        else if(p == 2)
        {
            fin>>a;
        }
    }

    fin.close(); fout.close();
    return 0;
}