Cod sursa(job #3288461)

Utilizator ItsHezovPahonie George Alessio ItsHezov Data 22 martie 2025 14:09:10
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
const int mxN = 1e5;
int aib[mxN+1];
int n, m,x;
int ub(int x)
{
    return (x & (-x));
}
void add(int poz, int val)
{
    for(int i = poz;i<=n;i+=ub(i))
        aib[i]+=val;
}
int sum(int x)
{
    int sol = 0;
    for(int i = x;i>0;i-=ub(i))
        sol+=aib[i];
    return sol;
}
int sum(int l, int r)
{
    return sum(r) - sum(l-1);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for(int i = 1;i<=n;i++)
        cin >> x, add(i,x);
    for(int i = 1;i<=m;i++)
    {
        int op;
        cin >> op;
        if(op == 0)
        {
            int a, b;
            cin >> a >> b;
            add(a,b);
        }
        if(op == 1)
        {
            int a , b;
            cin >> a >> b;
            cout << sum(a,b) << '\n';
        }
        if(op == 2)
        {
            int a,poz = 0,sol = 0; cin >> a;
            for(int b = 17;b>=0;b--)
            {
                if(poz + (1<<b) <= n && sol + aib[poz+(1<<b)] < a)
                {
                    sol += 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;
}