Cod sursa(job #2215920)

Utilizator AvramDanielAvram Daniel AvramDaniel Data 24 iunie 2018 12:20:22
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
using namespace std;

int arb[100010];
int n,m;


void add(int i,int x)
{
    while(i<=n)
    {
        arb[i]+=x;
        i+=(i&(-i));
    }
}

int sum(int i)
{
    int res=0;
    while(i>0)
    {
        res+=arb[i];
        i-=(i&(-i));
    }
    return res;
}

int summin(int a)
{
    int i,step;
    for(step=1;step<=n;step <<= 1);
    for(i = 0;step;step >>= 1)
    {
        if(i + step <=n)
        {
            if(a >= arb[i + step])
            {
                i+=step; a-=arb[i];
                if(!a) return i;
            }
        }
    }
    return -1;

}
int main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    int x, a,b,q;
    cin>>n>>m;
    for(int i = 1;i <= n;i++)
    {
        cin>>x;
        add(i,x);
    }
    for(int i=1;i<=m;i++)
    {
        cin>>q;
        if(q==0)
        {
            cin>>a>>b;
            add(a,b);
        }
        if(q==1)
        {
            cin>>a>>b;
            cout<<sum(b)-sum(a-1)<<'\n';
        }
        if(q==2)
        {
            cin>>a;
            cout<<summin(a)<<'\n';
        }
    }

  return 0;
}