Cod sursa(job #3150843)

Utilizator iulianarsenoiuArsenoiu Iulian iulianarsenoiu Data 18 septembrie 2023 18:03:56
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 1e5;

int n,m;
int v[nmax + 5];

int aib[nmax + 5];

int ub(int x)
{
    return (x & (-x));
}

void add(int x, int y)
{
    for(int i=x;i<=n;i+=ub(i))
    {
        aib[i] += y;
    }
}

int sum(int x)
{
    int rez = 0;
    for(int i=x;i>=1;i-=ub(i))
    {
        rez += aib[i];
    }
    return rez;
}

int main()
{
    freopen("nr.in","r",stdin);
    freopen("nr.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
        add(i,v[i]);
    }
    for(int i=1;i<=m;i++)
    {
        int tip;
        cin>>tip;
        if(tip==0)
        {
            int poz, val;
            cin>>poz>>val;
            add(poz,val);
        }
        else if(tip==1)
        {
            int a, b;
            cin>>a>>b;
            cout<<sum(b) - sum(a - 1)<<'\n';
        }
        else
        {
            int a;
            cin>>a;
            int s = 0, poz = 0;
            for(int b=17;b>=0;b--)
            {
                if(poz + (1<<b) <= n && s + aib[poz + (1<<b)] < a)
                {
                    s += aib[poz + (1<<b)];
                    poz += (1<<b);
                }
            }
            if(poz + 1 > n || sum(poz + 1) != a)
            {
                cout<<-1<<'\n';
            }
            else
            {
                cout<<poz + 1<<'\n';
            }
        }
    }
    return 0;
}