Cod sursa(job #2392169)

Utilizator elenaisaiaElena Isaia elenaisaia Data 29 martie 2019 19:01:05
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>

using namespace std;

int n,m,a[100003],b[100003],nr;

void adaug(int i,int x)
{
    if(i>n)
        return;
    b[i]+=x;
    int y=i&(-i);
    adaug(i+y,x);
}

int suma(int x)
{
    if(x>=1)
    {
        long long ceva;
        ceva=b[x];
        int y=x&(-x);
        ceva+=suma(x-y);
        return ceva;
    }
    return 0;
}

int poz(int x)
{
    int p;
    for(p=1;p<=n;p<<=1);
    for(int i=0;p;p>>=1)
    {
        if(i+p<=n&&x>=b[i+p])
        {
            i+=p;
            x-=b[i];
            if(!x)
                return i;
        }
    }
    return -1;
}

void citireafisare()
{
    ifstream fin("aib.in");
    ofstream fout("aib.out");
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>a[i];
        adaug(i,a[i]);
    }
    for(int i=1;i<=m;i++)
    {
        fin>>nr;
        int x,y;
        if(nr!=2)
        {
            fin>>x>>y;
            if(!nr)
                adaug(x,y);
            else
                fout<<suma(y)-suma(x-1)<<"\n";
        }
        else
        {
            fin>>x;
            fout<<poz(x)<<"\n";
        }
    }
}

int main()
{
    citireafisare();
    return 0;
}