Cod sursa(job #3303391)

Utilizator TudorAndreiHhHerta Tudor TudorAndreiHh Data 15 iulie 2025 13:23:27
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <bits/stdc++.h>
using namespace std;

struct AIB{

    vector<long long> aib;

    AIB(int n)
    {
        aib.resize(n+1);
    }

    int lsb(int nr)
    {
        int val;
        val = (nr & (-nr));
        return val;
    }

    void update(int x, int poz)
    {
        int i;
        for(i = x; i< aib.size(); i+=lsb(i))
        {
            aib[i]+=poz;
        }
    }

    long long int query(int x)
    {
        if(x >= aib.size())return -1;
        int i;
        long long sum = 0;
        for(int i = x; i > 0; i-=(lsb(i)))
        {
            sum+=aib[i];
        }
        return sum;
    }
    int cbin(long long s)
    {
        int ans = 0;
        long long sum_ans = 0;
        for(int pas = (1 << 18); pas > 0; pas/=2)
        {
            if(ans+pas >= aib.size()){continue;}
            if(sum_ans + aib[ans+pas]<s)
            {
                ans+=pas;
                sum_ans+=aib[ans];
            }
        }
        return ans+1;
    }
};
int main()
    {
        ifstream cin("aib.in");
        ofstream cout("aib.out");
        ios_base::sync_with_stdio(false);
        cin.tie(0);
        int n;
        cin >> n;
        AIB aib(n+1);
        int q;
        cin >> q;
        int x;
        for(int i = 1; i<= n; i++)
        {
            cin >> x;
            aib.update(i, x);
        }
        for(int i = 1; i<= q; i++)
        {
            int c; cin >> c;
            if(c == 0){
            int a, b; cin >> a >> b;
            aib.update(a, b);}
            else if(c == 1)
            {
                int a, b;
                cin >> a >> b;
                cout << aib.query(b) - aib.query(a-1)<<" "<< endl;
            }
            else if(c == 2)
            {
                long long s; cin >> s;
                int pos = aib.cbin(s);
                if(aib.query(pos) == s)cout << pos << endl;
                else cout << -1 << endl;
            }
        }
    return 0;
}