Cod sursa(job #2197475)

Utilizator PredaBossPreda Andrei PredaBoss Data 22 aprilie 2018 11:56:52
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;
int n,m,c,a,b,incipit;
int sir[100005];
int find_sum(int k)
{
    int where=incipit;
    for(int i=0;where>0;where>>=1)
    {
        if(i+where<=n)
        {
            if(k>=sir[i+where])
            {
                i+=where;
                k-=sir[i];
                if(k==0)
                    return i;
            }
        }
    }
    return -1;
}
int sum(int pos1,int pos2)
{
    int sum1=0;
    while(pos1>0)
    {
        sum1+=sir[pos1];
        pos1-=pos1&(-pos1);
    }
    int sum2=0;
    while(pos2>0)
    {
        sum2+=sir[pos2];
        pos2-=pos2&(-pos2);
    }
    return sum1-sum2;
}
void add(int pos,int val)
{
    while(pos<=n)
    {
        sir[pos]+=val;
        pos+=pos&(-pos);
    }
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&c);
        add(i,c);
    }
    for(incipit=1;incipit<n;incipit<<=1);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&c);
        if(c==0)
        {
            scanf("%d%d",&a,&b);
            add(a,b);
            continue;
        }
        if(c==1)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",sum(b,a-1));
            continue;
        }
        scanf("%d",&a);
        printf("%d\n",find_sum(a));
    }
    return 0;
}