Cod sursa(job #2604347)

Utilizator As932Stanciu Andreea As932 Data 22 aprilie 2020 15:01:54
Problema Arbori indexati binar Scor 0
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,interval=1;
    while(interval<n)interval*=2;

    while(interval)
    {
        if(aib[idx+interval]<=val && idx+interval<=n)
        {
            val-=aib[idx+interval];
            idx+=interval;
        }
        interval/=2;
    }

    if(idx==0)return -1;

    return idx;
}

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;
}