Cod sursa(job #2604350)

Utilizator As932Stanciu Andreea As932 Data 22 aprilie 2020 15:08:36
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");

const int nmax=100005;

int n,m,v[nmax],aib[nmax];

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

int query(int poz)
{
    int sum=0;

    for(;poz>0;poz-= poz & -poz)
        sum+=aib[poz];

    return sum;
}

int bs(int val)
{
    int idx=0,interv;

    for(interv=1;interv<n;interv*=2);

    for(;interv>0;interv/=2)
        if(idx+interv<=n)
            if(aib[idx+interv]<=val)
            {
                idx+=interv;
                val-=aib[idx];

                if(!val)return idx;
            }

    return -1;
}

void read()
{
    fin>>n>>m;

    for(int i=1;i<=n;i++)
    {
        fin>>v[i];

        update(i,v[i]);
    }

    for(int i=1;i<=m;i++)
    {
        int op,a,b;

        fin>>op;

        if(op<=1)fin>>a>>b;
        else fin>>a;

        if(!op)update(a,b);
        else if(!(--op))fout<<query(b)-query(a-1)<<"\n";
        else fout<<bs(a)<<"\n";
    }
}

int main()
{
    read();

    return 0;
}