Cod sursa(job #3157517)

Utilizator poparobertpoparobert poparobert Data 15 octombrie 2023 17:29:28
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
typedef long long ll;
#define lsb(x) ((x)&(-x))
class AIB{
    vector<ll> v;
public:
    AIB(ll n){v.resize(n+1);}
    void addval(ll p,ll val=1){for(;p<v.size();p+=lsb(p))v[p]+=val;}
    ll ask(ll p){ll rez=0;for(;p;p-=lsb(p))rez+=v[p];return rez;}
};
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ll n,q,c,a,b,i,st,dr,mid,rez;
    cin>>n>>q;
    AIB aib(n);
    for(i=0;i<n;i++)
    {
        cin>>a;
        aib.addval(i+1,a);
    }
    while(q--)
    {
        cin>>c>>a;
        switch(c)
        {
        case 0:
            cin>>b;
            aib.addval(a,b);
            break;
        case 1:
            cin>>b;
            cout<<aib.ask(b)-aib.ask(a-1)<<'\n';
            break;
        case 2:
            st=1;
            dr=n;
            while(true)
            {
                if(st==dr)
                {
                    if(aib.ask(st)<=a)rez=st;
                    break;
                }
                mid=(st+dr)/2;
                if(aib.ask(mid)<=a)rez=mid,st=mid+1;
                else dr=mid;
            }
            if(aib.ask(rez)==a)cout<<rez<<'\n';
            else cout<<-1<<'\n';
            break;
        }
    }
	return 0;
}