Cod sursa(job #3246221)

Utilizator Iancu007Sandea Iancu-Ioan Iancu007 Data 2 octombrie 2024 12:20:58
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>

using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int n;
long long aib[200005];
int fsb(long long x)
{
    return x&-x;
}
long long query(long long pos)
{
    long long s=0;
    while (pos)
    {
        s+=aib[pos];
        pos-=fsb(pos);
    }
    return s;
}
void upd(long long pos, long long x)
{
    while (pos<=n)
    {
        aib[pos]+=x;
        pos+=fsb(pos);
    }
}
long long cautbin(long long a)
{
    long long pos=0, pas=(1<<20), minte=0;
    while (pas)
    {
        if (pos + pas <= n && minte+aib[pos+pas]<a)
        {
            minte+=aib[pos+pas];
            pos+=pas;
        }
        pas/=2;
    }
    if (query(pos+1)==a)
        return pos+1;
    return -1;
}
int main()
{
    cin>>n;
    int m;
    cin>>m;
    int a, b, c;
    for (int i=1; i<=n; i++)
    {
        cin>>a;
        upd(i, a);
    }
    for (int i=1; i<=m; i++)
    {
        cin>>a;
        if (a==0)
        {
            cin>>b>>c;
            upd(b,c);
        }
        if (a==1)
        {
            cin>>b>>c;
            cout<<query(c)-query(b-1)<<'\n';
        }
        if (a==2)
        {
            cin>>b;
            cout<<cautbin(b)<<'\n';
        }
    }
    return 0;
}