Cod sursa(job #3246218)

Utilizator CarenaMironov Cezar Luca Carena Data 2 octombrie 2024 12:16:04
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#define NMAX (int)(1e5)

using namespace std;

ifstream cin("aib.in");
ofstream cout("aib.out");

int aib[NMAX], n;

inline int lsb(int x)
{
    return x&(-x);
}

void build()
{
    for(int i=1;i<=n;i++)
        if(i+lsb(i)<=n)
            aib[i+lsb(i)]+=aib[i];
}

void update(int pos, int val)
{
    for(int i=pos;i<=n;i+=lsb(i))
        aib[i]+=val;
}

int query(int pos)
{
    int s=0;
    for(int i=pos;i>=1;i-=lsb(i))
        s+=aib[i];
    return s;
}

int caut_bin(int a)
{
    int pas=(1<<(31-__builtin_clz(n))), r=pas, s=aib[pas];
    while(pas>1)
    {
        pas/=2;
        if(s<a && r+pas<=n)
        {
            r+=pas;
            s+=aib[r];
        }
        else if(s>a && r-pas>=1)
        {
            s-=aib[r];
            r-=pas;
            s+=aib[r];
        }
        else if(s==a)
            return r;
    }
    if(s==a)
        return r;
    return -1;
}

int main()
{
    int m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>aib[i];
    build();
    while(m--)
    {
        int t, a, b;
        cin>>t>>a;
        if(t==2)
            cout<<caut_bin(a)<<'\n';
        else
        {
            cin>>b;
            if(t)
                cout<<query(b)-query(a-1)<<'\n';
            else
                update(a, b);
        }
    }
    return 0;
}