Cod sursa(job #2912771)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 10 iulie 2022 16:48:45
Problema Arbori indexati binar Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("aib.in");
ofstream fout ("aib.out");

const int NMAX=1e5+5;
int aib[NMAX];
int v[NMAX];
int bcmm;
int n;

int lsb(int x)
{
    return x^(x&(x-1));
}

void update(int val,int p)
{
    while(p<=n)
    {
        aib[p]=aib[p]+val;
        p=p+lsb(p);
    }
}

long long cerinta1(int p)
{
    long long s=0;
    while(p>0)
    {
        s=s+aib[p];
        p=p-lsb(p);
    }
    return s;
}

int cerinta2(int val)
{
        int s=0,p=0,i;
        for(i=bcmm;i>0;i=i/2)
        {
            if(p+i<=n)
            {
                if(s+aib[p+i]<val)
                {
                    s+=aib[p+i];
                    p=p+i;
                }
            }
        }
        if(s+v[p+1]!=val)
            return -1;
        return p+1;
}

int main()
{
    int i,j,m,x,y,cer,a,b;
    fin>>n>>m;
    bcmm=1;
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
        update(v[i],i);
    }
    while(bcmm*2<=n)
    {
        bcmm=bcmm*2;
    }
    for(i=1;i<=m;i++)
    {
        fin>>cer;
        if(cer==0)
        {
            fin>>a>>b;
            update(b,a);
        }
        if(cer==1)
        {
            fin>>a>>b;
            fout<<cerinta1(b)-cerinta1(a-1)<<"\n";
        }
        if(cer==2)
        {
            fin>>a;
            fout<<cerinta2(a)<<"\n";
        }
    }
    return 0;
}