Cod sursa(job #2494254)

Utilizator pimao2004Lupu Stefan Dragos pimao2004 Data 17 noiembrie 2019 16:49:32
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>

using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");
int aib[100007];
int n;
int zero(int x)
{
    return ((x^(x-1))&x);
}
void update(int poz,int x)
{
    for(int i=poz;i<=n;i+=zero(i))
        aib[i]+=x;
}
int sum(int poz)
{
    int r=0;
    for(int i=poz;i>0;i-=zero(i))
        r+=aib[i];
    return r;
}
int caut(int x)
{
    int pas;
    for(pas=1;pas<=n;(pas<<=1));
    for(int i=0;pas;(pas>>=1))
    {
        if(i+pas<=n&&aib[i+pas]<=x)
        {
            x-=aib[i+pas];
            i+=pas;
            if(!x)
                return i;
            if(x<0)
                return -1;
        }
    }
    return -1;
}
int main()
{
    int m;
    in>>n>>m;
    int i,x;
    for(i=1;i<=n;i++)
    {
        in>>x;
        update(i,x);
    }
    int a,b,q;
    for(i=1;i<=m;i++)
    {
        in>>q;
        in>>a;
        if(q!=2)
        {
            in>>b;
            if(!q)
                update(a,b);
            else out<<sum(b)-sum(a-1);
        }
        else
        {
            out<<caut(a);
        }
        if(q)
        out<<'\n';
    }
    return 0;
}