Cod sursa(job #2878897)

Utilizator rares_ciocieaRares Andrei Ciociea rares_ciociea Data 28 martie 2022 09:14:45
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int aib[100010],n,v[100001],logn;

void build()
{
    for(int i=1;i<=n;i++)
    {
        aib[i]+=v[i];
        if(i+(i&-i)<=n)
            aib[i+(i&-i)]+=aib[i];
    }
}

void update(int i,int val)
{
    for(int j=i;j<=n;j+=j&-j)
        aib[j]+=val;
}


int query(int r)
{
    int sum=0;
    for(int i=r;i>0;i-=i&(-i))
        sum+=aib[i];
    return sum;
}

int cautbin(int val) {
  int sum=0;
  int ans=0;
  for(int i=logn;i>=0;i--)
  {
    if((ans+(1<<i))<=n && sum+aib[ans+(1<<i)]<val)
    {
      sum+=aib[ans+(1<<i)];
      ans+=(1<<i);
    }
  }
  return ans;
}

int main()
{
    int q;
    in>>n>>q;
    for(int i=1;i<=n;i++)
        in>>v[i];
    logn=floor(log2(n));
    build();
    for(int i=1;i<=q;i++)
    {
        int c;
        in>>c;
        int a,b;
        if(c==0)
        {
            in>>a>>b;
            update(a,b);
        }
        if(c==1)
        {
            in>>a>>b;
            out<<query(b)-query(a-1)<<'\n';
        }
        if(c==2)
        {
            in>>a;
            int index=cautbin(a)+1;
            if(query(index)==a)
                out<<index<<'\n';
            else
                out<<"-1\n";
        }
    }

    return 0;
}