Cod sursa(job #2978140)

Utilizator aaagabiTurbinca Gabriel aaagabi Data 13 februarie 2023 09:22:29
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,op,st,dr,val,poz;
int aib[100005];
int v[100005];
int lsb(int x)
{
    return (x&(-x));
}
int query(int poz)
{
    int sum=0;
    for(int i=poz;i>0;i-=lsb(i))
        sum+=aib[i];
    return sum;
}
void update(int poz,int val)
{
    for(int i=poz;i<=n;i+=lsb(i))
        aib[i]+=val;
}
int cautare(int val)
{
    int ans=0,r=n,l=1,mid;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(query(mid)>=val)
            ans=mid,r=mid-1;
        else
            l=mid+1;
    }
    if(ans==0||query(ans)!=val)
        return -1;
    else
        return ans;
}
int main()
{
    ios_base::sync_with_stdio(0);
    fin.tie(0);
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    for(int i=1;i<=n;i++)
        update(i,v[i]);
    for(int i=1;i<=m;i++)
    {
        fin>>op;
        if(op==0)
        {
            fin>>poz>>val;
            update(poz,val);
        }
        if(op==1)
        {
            fin>>st>>dr;
            fout<<query(dr)-query(st-1)<<'\n';
        }
        if(op==2)
        {
            fin>>val;
            fout<<cautare(val)<<'\n';
        }
    }
    return 0;
}