Cod sursa(job #1540145)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 2 decembrie 2015 11:15:43
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <stdio.h>

#define zeros(x)((x^(x-1))&x)
#define Ndim 100001
#define in "aib.in"
#define out "aib.out"

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int AIB[Ndim],N,M;
void update(int poz, int quantity)
{
    int i;
    for(i=poz;i<=N; i+=zeros(i))
    {
        AIB[i]+=quantity;
    }
}
int query(int x)
{
    int i,val=0;
    for(i=x;i>0;i-=zeros(i))
    {
        val+=AIB[i];
    }
    return val;
}
int Search(int val)
{
    int i,step;
    for(step=1;step<N;step<<=1);
    for(i=0; step; step >>= 1)
    {
        if(i+step <= N)
        {
            if(val >=AIB[i+step])
            {
                i+=step;
                val -= AIB[i];
                if(!val)
                    return i;
            }
        }
    }
    return -1;
}
int main()
{
    int i,a,b,k,x;
    freopen(in, "r", stdin);
    freopen(out,"w",stdout);
    scanf("%d%d", &N, &M);
    for(i=1;i<=N;i++)
    {
        scanf("%d", &x);
        update(i,x);
    }
    for(;M;M--)
    {
        scanf("%d",&k);
        if(k<2)
        {
            scanf("%d%d", &a,&b);
            if(!k)
                update(a,b);
            else
                printf("%d\n", query(b)-query(a-1));
        }
        else
        {
            scanf("%d",&a);
            printf("%d\n", Search(a));
        }

    }
    return 0;
}