Cod sursa(job #3288275)

Utilizator matei_costeaMatei Costea matei_costea Data 21 martie 2025 11:34:08
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

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

#define cin fin
#define cout fout
#define zeros(x) ((x^(x-1))&x)

int n, A[100005];

void Add(int x,int val)
{
    for(int i=x;i<=n;i+=zeros(i))
    {
        A[i]+=val;
    }
}

int Compute(int x)
{
    long int s=0;
    for(int i=x;i>0;i-=zeros(i))
    {
        s+=A[i];
    }
    return s;
}

long int s_tot=0,puteri[30],p_max=0;

void init(int n)
{
    puteri[0]=1;
    int i=0;
    while(puteri[i]<=n)
    {
        puteri[i+1]=puteri[i]*2;
        i++;
    }
    p_max=i-1;
}

int main()
{
    int m;
    cin>>n>>m;
    int x;
    init(n);
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        s_tot+=x;
        Add(i,x);
    }
    int c,a,b;
    for(int i=0;i<m;i++)
    {
        cin>>c>>a;
        if(c==0)
        {
            cin>>b;
            s_tot+=b;
            Add(a,b);
        }
        else if(c==1)
        {
            cin>>b;
            cout<<Compute(b)-Compute(a-1)<<'\n';
        }
        else
        {
            int k=0,s_act=0;
            for(int i=p_max;i>=0;i--)
            {
                if(s_act+A[puteri[i]]<=a)
                {
                    s_act+=A[puteri[i]];
                    k+=puteri[i];
                }
            }
            cout<<k<<'\n';
        }
    }
    return 0;
}