Cod sursa(job #2999328)

Utilizator MihiBluBalau Mihai MihiBlu Data 10 martie 2023 20:39:02
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int n, m, x, poz;
int a, b, c;
int v[200005];
long long u[200005];
long long s[25];
long long sum=0;

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

void querry(int nod, int st, int dr)
{
    if(st >= a && dr <= b)
        sum+=v[nod];
    else
    {
        int mij=(st+dr)/2;
        if( a <= mij )
            querry(nod*2, st, mij);
        if ( b > mij)
            querry(nod*2+1, mij+1, dr);
    }
}

int main()
{
    f>>n>>m;
    for(int i=1; i<=n; i++)
    {
        f>>x;
        poz=i;
        update(1, 1, n);
    }
    for(int i=1; i<=m; i++)
    {
        f>>c;
        if(c==0)
        {
            f>>a>>b;
            poz=a;
            x=b;
            update(1, 1, n);
        }
        else if(c==1)
        {
            f>>a>>b;
            sum=0;
            querry(1, 1, n);
            g<<sum<<'\n';
        }
        else
        {
            f>>a;
            for(int i=1; i<=n; i++)
                s[i]=s[i-1]+u[i];
            int st=1, dr=n;
            int gasit=0;
            while(!gasit)
            {
                int mij=(st+dr)/2;
                if(s[mij] == a)
                    gasit=mij;
                else if(s[mij] > a)
                    dr=mij-1;
                else
                    st=mij+1;

            }
            g<<gasit<<'\n';
        }
    }
    return 0;
}