Cod sursa(job #2515405)

Utilizator Rares31100Popa Rares Rares31100 Data 28 decembrie 2019 15:36:30
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <cmath>

using namespace std;

ifstream cin("aib.in");
ofstream cout("aib.out");

int n,m,baza;
int arb[100001];

void updateArb(int poz,int val)
{
    while(poz<=n)
    {
        arb[poz]+=val;
        poz+=(poz&-poz);
    }
}

int sumArb(int poz)
{
    int s=0;

    while(poz)
    {
        s+=arb[poz];
        poz-=(poz&-poz);
    }

    return s;
}

int main()
{
    cin>>n>>m;

    baza=pow(2, (int)log2(n)+1);

    for(int val,i=1;i<=n;i++)
    {
        cin>>val;
        updateArb(i,val);
    }

    for(int q,a,b,k=1;k<=m;k++)
    {
        cin>>q;

        switch(q)
        {
            case 0:
                cin>>a>>b;
                updateArb(a,b);

                break;
            case 1:
                cin>>a>>b;
                cout<<sumArb(b)-sumArb(a-1)<<'\n';

                break;
            case 2:
                cin>>a;

                int poz=0;

                for(int p=baza;p;p/=2)
                    if(poz+p<=n && sumArb(poz+p)<a)
                        poz+=p;

                poz++;

                if(sumArb(poz)!=a)
                    cout<<-1<<'\n';
                else
                    cout<<poz<<'\n';

                break;
        }
    }

    return 0;
}