Cod sursa(job #1148390)

Utilizator vyrtusRadu Criuleni vyrtus Data 20 martie 2014 18:52:40
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <stdio.h>

#define nmax 100001

using namespace std;
long sum[nmax];
long a,b,n,m, sol ;

void update(int poz , int val)
{
    while (poz <= n)
    {
        int p = 0;
        while (!(poz & (1 << p)) ) {p++;}
        sum[poz] += val;
        poz += (1<<p);
    }
}

long query(int num)
{
    int s = 0;
        while (num > 0)
        {
           int p = 0;
        while (!(num & (1 << p)) ) {p++;}
            s += sum[num];
            num -= (1 << p);
        }
    return s;
}

int search(long val)
{
        int s = 1; while(s < n) {s = s << 1;}
        int v = 0;

        while (s)
        {
            if (v + s <=n)
             if (val >= sum[v+s])
            {
                v += s;
                val -= sum[v];
                if (val == 0) {return v;}
            }

          s = s >> 1;
        }
    return -1;
}
int main()
{
    freopen("aib.in" , "r" , stdin);
    freopen("aib.out", "w" ,stdout);
        scanf("%d%d",&n,&m );
        for (int i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            update(i,x);
        }

    for (int i =1;i<=m;i++)
    {
        int x;
         scanf("%d",&x);
        if (x == 0) { int poz;  scanf("%d%d",&poz,&a); update(poz,a); }
            else if (x == 1)
                { scanf("%i%i",&a,&b);
                    sol = query(b) - query(a-1);
                    printf("%d\n",sol);
                }
                else
                {
                    int k; scanf("%d",&k);
                    printf("%d\n",search(k));
                }
    }
    return 0;
}