Cod sursa(job #2884375)

Utilizator Cojocaru_Andrei_CristianCojocaru Andrei Cristian Cojocaru_Andrei_Cristian Data 3 aprilie 2022 02:15:48
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>

using namespace std;

long long v[200005],aib[200005],n;

long long lsb(long long nod)
{
    long long k=nod&(-nod);
    return k;
}

void update(long long nod,long long val)
{
    do
    {
        aib[nod]+=val;
        nod+=lsb(nod);
    }
    while(nod<=n);
}

long long querry1(long long start,long long finish)
{
    long long s=0;
    while(finish)
    {
        s+=aib[finish];
        finish-=lsb(finish);
    }
    start-=1;
    while(start)
    {
        s-=aib[start];
        start-=lsb(start);
    }
    return s;
}

long long querry2(long long val)
{
    long long last=-1,st=0,sum=0;
    long long put=1;
    while(put<=n)
    {
        put=put*2;
    }
    put/=2;
    while(put)
    {
        if(put+st<=n)
        {
            if(sum+aib[put+st]>=val)
            {
                if(sum+aib[put+st]==val)
                {
                    last=put+st;
                }
            }
            else
            {
                sum+=aib[put+st];
                st+=put;
            }
        }
        put/=2;
    }
    return last;
}

int main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    long long m;
    cin>>n>>m;
    for(long long i=1; i<=n; i++)
    {
        cin>>v[i];
        update(i,v[i]);
    }
    long long t,a,b;
    for(long long i=1; i<=m; i++)
    {
        cin>>t;
        if(t==0)
        {
            cin>>a>>b;
            update(a,b);
        }
        else
        {
            if(t==1)
            {
                cin>>a>>b;
                cout<<querry1(a,b)<<"\n";
            }
            else
            {
                cin>>a;
                cout<<querry2(a)<<"\n";
            }
        }
    }
    return 0;
}