Cod sursa(job #2296528)

Utilizator refugiatBoni Daniel Stefan refugiat Data 4 decembrie 2018 19:18:56
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream si("aib.in");
ofstream so("aib.out");
int aib[100005],n;
inline void update(int poz,int a)
{
    while(poz<=n)
    {
        aib[poz]+=a;
        poz+=(poz&(-poz));
    }
}
inline int query1(int a)
{
    int sol=0;
    while(a)
    {
        sol+=aib[a];
        a-=a&(-a);
    }
    return sol;
}
int query2(int a)
{
    int poz=0;
    for(int i=1<<17;i;i>>=1)
    {
        if(i+poz<=n)
        {
            if(aib[i+poz]<=a)
            {
                poz+=i;
                a-=aib[poz];
                if(!a)
                    return poz;
            }
        }
    }
    return -1;
}
int main()
{
    int m;
    si>>n>>m;
    int a,b,c;
    for(int i=1;i<=n;++i)
    {
        si>>a;
        update(i,a);
    }
    while(m--)
    {
        si>>a>>b;
        if(a==0)
        {
            si>>c;
            update(b,c);
        }
        else
        {
            if(a==1)
            {
                si>>c;
                so<<query1(c)-query1(b-1)<<'\n';
            }
            else
            {
                so<<query2(b)<<'\n';
            }
        }
    }
    return 0;
}