Cod sursa(job #1512927)

Utilizator LurchssLaurentiu Duma Lurchss Data 28 octombrie 2015 19:46:09
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <bitset>

#define nmax 100005
using namespace std;
int n,m;
int aib[nmax];

int lg(int x)
{
    int nrz=0;
    while(!(x&1))
    {
        x >>= 1;
        nrz++;
    }
    return 1 << nrz;
}

void update(int i,int x)
{
    for(int j=i;j<=n;)
    {
        aib[j]+=x;
        j+=lg(j);
    }
}
void read()
{
    scanf("%d %d",&n,&m);
    int x;
    for(int i=1;i<=n;i++)
    {
        scanf("%d ",&x);
        update(i,x);
    }
}

int query(int x)
{
    int sum=0;
    for(int i=x;i>=1;)
    {
        sum+=aib[i];
        i-=lg(i);
    }
    return sum;
}
void solve()
{
    int tip,a,b;
    for(int i=1;i<=m;i++)
    {
        scanf("%d ",&tip);
        if(tip==0)
        {
            scanf("%d %d",&a,&b);
            update(a,b);
            continue;
        }
        if(tip==1)
        {
            scanf("%d %d",&a,&b);
            printf("%d\n",query(b)-query(a-1));
            continue;
        }
        if(tip==2)
        {
            scanf("%d ",&a);
            for(int p=1;p<=n;p++)
                if(query(p)==a)
                    {printf("%d\n",p);
                    break;}
        }
    }
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    read();
    solve();
    return 0;
}