Cod sursa(job #1835150)

Utilizator sahleancosminSahlean Cosmin sahleancosmin Data 26 decembrie 2016 14:04:37
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>

using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,com,a,b;
int sum[100001];
inline int imp(int poz)
{
    int k=0;
    while(poz%2==0)
    {
        poz/=2;
        k++;

    }
    return k;
}
void adauga(int poz,int x)
{
    while(poz<=n)
    {
        sum[poz]+=x;
        poz+=1<<imp(poz);
    }
}
int sum2(int poz)
{
    int k=0;
    while(poz>=1)
    {
        k+=sum[poz];
        poz-=1<<imp(poz);
    }
    return k;
}
int cauta(int sm)
{
    int i=0,ad=1,capat=n;
    for(ad=1;ad<=n;ad <<=1);
    for(int i=0;ad;ad >>=1)
    {
        if(i+ad<=n)
        {
            if(sm >=sum[i+ad])
            {
                sm-=sum[i+ad];
                i+=ad;
                if(!sm)
                    return i;
            }
        }
    }
    return -1;
}
int main()
{
    f>>n>>m;

    for(int i=1;i<=n;i++)
        {
            f>>a;
            adauga(i,a);
        }

    for(int i=1;i<=m;i++)
    {
        f>>com;
        if(com==0)
        {
            f>>a>>b;
            adauga(a,b);

        }else if(com==1)
        {
            f>>a>>b;
            g<<sum2(b)-sum2(a-1)<<'\n';
        }else{
            f>>a;
          g<<cauta(a)<<'\n';
        }
    }
    return 0;
}