Cod sursa(job #1765053)

Utilizator c0mradec0mrade c0mrade Data 26 septembrie 2016 11:28:35
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");

int n,q,aib[100010];

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

int query(int x)
{
    int s=0;
    for(;x;x-=(x^(x-1))&x)
        s+=aib[x];
    return s;
}

int searcH(int val)
{
    int i,step;
    for(step=1;step<=n;step<<=1);
    step>>=1;
    for(i=0;step;step>>=1)
    {
        if(i+step<=n)
        {
            if(aib[i+step]<=val)
            {
                i+=step;
                val-=aib[i];
                if(!val)
                    return i;
            }
        }
    }
    return -1;
}

int main()
{
    f>>n>>q;
    for(int i=1;i<=n;++i)
    {
        int x;
        f>>x;
        update(i, x);
    }
    for(int i=1;i<=q;++i)
    {
        int p,x,y;
        f>>p;
        if(!p)
        {
            f>>x>>y;
            update(x, y);
        }
        else if (p==1)
        {
            f>>x>>y;
            g<<query(y)-query(x-1)<<'\n';
        }
        else
        {
            f>>x;
            g<<searcH(x)<<'\n';
        }
    }
    return 0;
}