Cod sursa(job #2324370)

Utilizator ionicaion ionica Data 20 ianuarie 2019 17:25:34
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
/// http://algopedia.ro/wiki/index.php/Clasele_11-12_lec%C8%9Bia_7_-_29_oct_2014

#include <fstream>
#define NM 100006
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,aib[NM],val;
int op,a,b;

void adauga(int x,int val)
{
    int p;
    do
    {
        aib[x]=aib[x]+val;
        p=x&(x^(x-1)) ;
        x=x+p;

    }
    while(x<=n);
}

int suma(int x)
{
    int s=0,p;
    while(x>0)
    {
        s=s+aib[x];
        p=x&(x^(x-1)) ;
        x=x-p;

    }
    return s;
}

int main()
{
    int i,st,dr,mij,gasit,s;
    fin>>n>>m;
    for(i=1; i<=n; i++)
    {
        fin>>a;
        adauga(i,a);
    }
    for(int i=1; i<=m; i++)
    {
        fin>>op;
        if(op==0)
        {
            fin>>a>>b;
            adauga(a,b);
        }
        else
            if(op==1)
            {
                fin>>a>>b;
                fout<<suma(b)-suma(a-1)<<'\n';
            }
            else
            {
                fin>>a;
                gasit=0;
                st=1;dr=n;
                gasit=0;
                while(st<=dr&&!gasit)
                {
                    mij=(st+dr)/2;
                    s=suma(mij);
                    if(s==a)
                    {
                        fout<<mij<<'\n';
                        gasit=1;
                    }
                    else
                        if(a<s) dr=mij-1;
                        else st=mij+1;
                }
                if(gasit==0)
                    fout<<-1<<'\n';

        }
    }
    return 0;
}