Cod sursa(job #2393844)

Utilizator EricEric Vilcu Eric Data 1 aprilie 2019 09:40:30
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int n,m,a[100002],t,k,j,l;
void add(int i,int q)
{
    for(;i<=n;i=i+((i^(i-1))&i)){a[i]+=q;}
}
int aic(int i)
{
    int s=0;
    for(;i>0;i=i-((i^(i-1))&i))s+=a[i];
    return s;
}
int src(int q)
{
    int p=1;
    while(p<n)p*=2;
    for(int i=0;p>0;p/=2)
    {
        if(i+p<=n)
        {
            if(q>=a[i+p])
            {
                i+=p;q-=a[i];
                if(q==0)return i;
            }
        }
    }
    return 0;
}
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",&t);
        add(i,t);
    }
    for(int g=1;g<=m;++g)
    {
        scanf("%d",&k);
        switch(k)
        {
        case 0:
            scanf("%d%d",&k,&t);
            add(k,t);
            break;
        case 1:
            scanf("%d%d",&k,&t);
            printf("%d\n",aic(t)-aic(k-1));
            break;
        case 2:
            scanf("%d",&k);
            printf("%d\n",src(k));
            break;
        }
    }
}