Cod sursa(job #2186528)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 25 martie 2018 18:23:38
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <cstdio>
using namespace std;
int aib[100005],n,m;
void update(int poz,int val)
{
    while(poz<=n)
    {
        aib[poz]+=val;
        poz+=(poz&-poz);
    }
}
int sum(int poz)
{
    int rasp=0;
    while(poz>0)
    {
        rasp+=aib[poz];
        poz-=(poz&-poz);
    }
    return rasp;
}
int query(int val,int st=1,int dr=n)
{
    int mij,sumc;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        sumc=sum(mij);
        if(sumc==val)
            return mij;
        if(val<=sumc)
            dr=mij;
        else
            st=mij+1;
    }
    return -1;
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    int elem,t,a,b;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&elem);
        update(i,elem);
    }
    while(m--)
    {
        scanf("%d",&t);
        switch (t)
        {
            case 0:
                    scanf("%d%d",&a,&b);
                    update(a,b);
                    break;
            case 1:
                    scanf("%d%d",&a,&b);
                    printf("%d\n",sum(b)-sum(a-1));
                    break;
            case 2:
                    scanf("%d",&a);
                    printf("%d\n",query(a));
                    break;
        }
    }
    return 0;
}