Cod sursa(job #2872486)

Utilizator TeodoraMaria123Serban Teodora Maria TeodoraMaria123 Data 17 martie 2022 10:16:01
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
class aib
{
private:

    vector <int> v;
    int _n;
    int lsb(int pos)
    {
        return (pos&(-pos));
    }
public:
    aib (int n)
    {
        v.resize(n+1);
        _n=n;
    }
    void update(int pos,int val)
    {
        while(pos<=_n)
        {
            v[pos]+=val;
            pos+=lsb(pos);
        }
    }
    int query(int pos)
    {
        int sum=0;
        while(pos>=1)
        {
            sum+=v[pos];
            pos-=lsb(pos);
        }
        return sum;
    }
    int bs(int a)
    {
        int r=0,pas=1<<17,sum=0;
        while(pas)
        {
            if(r+pas<=_n  && sum+v[r+pas]<=a)
            {
                r+=pas;
                sum+=v[r];
                if(sum==a)
                    return r;
            }
            pas>>=1;
        }
        return -1;
    }
};
int main()
{
    int n,m;
    in>>n>>m;
    aib x(n);
    for(int i=1; i<=n; i++)
    {
        int a;
        in>>a;
        x.update(i,a);
    }
    for(int i=1; i<=m; i++)
    {
        int c,a;
        in>>c>>a;
        if(c==0)
        {
            int b;
            in>>b;
            x.update(a,b);
        }
        else if(c==1)
        {
            int b;
            in>>b;
            out<<x.query(b)-x.query(a-1)<<"\n";
        }
        else
            out<<x.bs(a)<<"\n";
    }
    return 0;
}