Cod sursa(job #3184320)

Utilizator iordachelMatei Iordache iordachel Data 15 decembrie 2023 12:05:38
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;
int n;
int aib[100005];
void update(int i, int val)
{
    while(i<=n)
    {
        aib[i]+=val;
        i+=(i&-i);
    }
}
int pref(int i)
{
    int res=0;
    while(i)
    {
        res+=aib[i];
        i-=(i&-i);
    }
    return res;
}
int main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    int m;
    cin>>n>>m;
    for(int i=1;i<=n;++i)
    {
        int a;cin>>a;
        update(i,a);
    }
    //for(int i=1;i<=n;++i)
        //cout<<aib[i]<<" ";
    //cout<<'\n';
    for(int i=1;i<=m;++i)
    {
        int op;cin>>op;
        if(op==0)
        {
            int a,b;
            cin>>a>>b;
            update(a,b);
        }
        if(op==1)
        {
            int a,b;
            cin>>a>>b;
            cout<<pref(b)-pref(a-1)<<'\n';
        }
        if(op==2)
        {
            int a;
            cin>>a;
            int st=1,dr=n,res=0;
            while(st<=dr)
            {
                int mij=(st+dr)/2;
                int x=pref(mij);//sa nu apelam de mai multe ori
                //cout<<mij<<" "<<x<<"  ";
                if(x>a)
                    dr=mij-1;
                else if(x<a)
                    st=mij+1;
                else
                    {res=mij;break;}
            }
            if(res==0)
                cout<<"-1\n";
            else
                cout<<res<<'\n';
        }
    }
}