Cod sursa(job #2379423)

Utilizator albucristianAlbu Cristian-Gabriel albucristian Data 13 martie 2019 16:19:55
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
using namespace std;
int v[100002];
int n,m,t,op,a,b;
void update(int poz,int val)
{
    int c=0;
    while(poz<=n)
    {
        v[poz]+=val;
        while(!(poz&(1<<c)))
            c++;
        poz+=(1<<c);
        c++;
    }
}
int query(int poz)
{
    int c=0,s=0;
    while(poz>0)
    {
        s+=v[poz];
        while(!(poz&(1<<c)))
            c++;
        poz-=(1<<c);
        c++;
    }
    return s;
}
int search(int val)
{
    int i,step;
    step=1;
    while(2*step<=n)
        step*=2;
    for(i=0;step;step/=2)
    {
        if(i+step<=n)
        {
            if(val>=v[i+step])
            {
                i+=step;
                val-=v[i];
                if(!val)
                    return i;
            }
        }
    }
    return -1;
}
int main()
{
    ifstream in("aib.in");
    ofstream out("aib.out");
    in>>n>>m;
    for(int i=1;i<=n;i++)
    {
        in>>t;
        update(i,t);
    }
    for(int i=1;i<=m;i++)
    {
        in>>op;
        if(op==0)
        {
            in>>a>>b;
            update(a,b);
        }
        if(op==1)
        {
            in>>a>>b;
            out<<query(b)-query(a-1)<<"\n";
        }
        if(op==2)
        {
            in>>a;
            out<<search(a)<<"\n";
        }
    }
    return 0;
}