Cod sursa(job #2297362)

Utilizator cyg_andrei_HHendoreanu Andrei Sebastian cyg_andrei_H Data 5 decembrie 2018 19:09:09
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>

using namespace std;

const int NMAX=100000;
int aib[NMAX+5];
int n;
void update(int p,int x)
{
    for(;p<=n;p+=(p&(-p)))
        aib[p]+=x;
}
int query(int p)
{
    int s;
    s=0;
    for(;p>=1;p-=(p&(-p)))
        s+=aib[p];
    return s;
}
int bs(int x)
{
    int st,dr,med,last;
    st=0;
    dr=n;
    while(st<=dr)
    {
        med=((st+dr)>>1);
        if(query(med)>=x)
        {
            last=med;
            dr=med-1;
        }
        else
            st=med+1;
    }
    return last;
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m,i,a,b,o,rez;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&a);
        update(i,a);
    }
    for(i=1;i<=m;++i)
    {
        scanf("%d%d",&o,&a);
        if(!o)
        {
            scanf("%d",&b);
            update(a,b);
        }
        else
        {
            if(o==1)
            {
                scanf("%d",&b);
                rez=query(b)-query(a-1);
                printf("%d\n",rez);
            }
            else
            {
                rez=bs(a);
                printf("%d\n",rez);
            }
        }
    }
    return 0;
}