Cod sursa(job #3345929)

Utilizator aadsafafdfAlexandru Spermezist aadsafafdf Data 11 martie 2026 19:54:04
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
ifstream fin("file.in");
ofstream fout("file.out");
#else // LOCAL
ifstream fin("aib.in");
ofstream fout("aib.out");
//#define fin cin
//#define fout cout
#endif // LOCAL
//#define int long long
//#pragma GCC optimize("Ofast")


int n,m;
int aib[100005],v[100005],spart[100005];

void make_aib()
{
    for(int siz=1;siz<=n;siz*=2)
    {
        for(int i=1;siz*i<=n;i+=2)
        {
            aib[i*siz]=spart[i*siz]-spart[(i-1)*siz];
        }
    }
}

void update(int pos,int diff)
{
    while(pos<=n)
    {
        aib[pos]+=diff;
        pos+=pos&(-pos);
    }
}

int query(int pos)
{
    int ret=0;
    while(pos)
    {
        ret+=aib[pos];
        pos-=pos&(-pos);
    }
    return ret;
}

int laba(int target)
{
    int l=1,r=n,mid;
    while(l<r)
    {
        mid=(l+r)/2;
        if(query(mid)>=target)
        {
            r=mid;
        }
        else l=mid+1;
    }
    if(query(r)!=target)return -1;
    return r;
}


signed main()//97-122
{
    fin>>n>>m;
    for(int i=1;i<=n;++i)
    {
        fin>>v[i];
        spart[i]=spart[i-1]+v[i];
    }
    make_aib();
    int a,b,c;
    for(int i=1;i<=m;++i)
    {
        fin>>c>>a;
        if(c!=2)fin>>b;
        if(c==0)
        {
            update(a,b);
        }
        if(c==1)fout<<query(b)-query(a-1)<<'\n';
        if(c==2)fout<<laba(a)<<'\n';
    }


    return 0;
}