Cod sursa(job #1624228)

Utilizator raztaapDumitru raztaap Data 2 martie 2016 09:30:54
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#define MAXN 100100
#include <vector>
using namespace std;
vector<int> tree;
int n, Q;
void update(int idx, int val)
{
    while(idx<=n)
    {
        tree[idx]+=val;
        idx+=(idx&-idx);
    }
}
int read(int idx)
{
   int sum=0;
   while(idx>0)
   {
       sum+=tree[idx];
       idx-=(idx&-idx);
   }
   return sum;
}
int cauta(int val)
{
    int i, step;
    for(step=1;step<n;step<<=1);
    for(i=0;step;step>>=1)
        if(i+step<=n)
        {
            if(val>=tree[i+step])
            {
                i+=step;
                val-=tree[i];
                if(!val) return i;
            }
        }
    return -1;
}
void initializare()
{
    int i;
    scanf("%d%d", &n, &Q);
    tree.assign(n+1,0);
    int x;
    for(i=1;i<=n;++i)
    {
        scanf("%d", &x);
        update(i, x);
    }
}
void rezolva_problema()
{
    initializare();
    int q,t,x,y;
    for(q=0;q<Q;++q)
    {
        scanf("%d", &t);
        if(t<=1)
        {
            scanf("%d%d", &x, &y);
            if(t==0)
                update(x, y);
            else
                printf("%d\n", read(y)-read(x-1));
        }
        else
        {
            scanf("%d", &x);
            printf("%d\n", cauta(x));
        }
    }
}
int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w",stdout);
    rezolva_problema();
    return 0;
}