Cod sursa(job #3303585)

Utilizator DragosVNVisanescu Dragos Nicholas DragosVN Data 16 iulie 2025 14:00:59
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int n,Q;
int lsb(int x)
{
    return x & (-x) ;
}
struct AIB{

    vector<long long>aib;

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

    }

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

    }

    long long query(int x)
    {
        long long sum=0;
        for( int i = x ; i > 0 ; i -= lsb(i) )
        sum += aib[i];

         return sum;

    }

    int cbin(long long s, bool strict = false) {
        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] + strict <= s) {
                ans += pas;
                sum_ans += aib[ans];
            }
        }
    return ans;
    }
};

int main()
{
    f>>n>>Q;
    AIB aib(n);
    for(int i=0;i<n;i++)
    {
        long long x;
        f>>x;
        aib.update(i+1,x);
    }

    for(int q=1;q<=Q;q++)
    {
        int op=0;
        f>>op;
        if(op==0)
        {
            int poz=0;
            long long val=0;
            f>>poz>>val;
            aib.update(poz,val);
        }
        else if(op==1)
        {
            int l=0,r=0;
            f>>l>>r;
            g<< aib.query(r) - aib.query(l-1)<<'\n';
        }
        else
        {
            long long a=0;
            f>>a;
            int ans=aib.cbin(a,1)+1;
            if(aib.query(ans)==a)
            g<<ans<<'\n';
            else
            g<<-1<<'\n';
        }
    }
    return 0;
}