Cod sursa(job #1162995)

Utilizator rares96cheseliRares Cheseli rares96cheseli Data 1 aprilie 2014 09:04:39
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#define lsb(x) -x&x
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");

int N, M, x, aib[100005], tip, A, B, pas=1;

void update(int poz, int val)
{
    while (poz<=N)
        aib[poz]+=val, poz+=lsb(poz);
}

int query(int poz)
{
    int sum=0;
    while (poz)
        sum+=aib[poz], poz-=lsb(poz);
    return sum;
}

int main()
{
    f>>N>>M;
    for (; pas<=N; pas<<=1);
    for (int i=1; i<=N; ++i)
        f>>x, update(i, x);
    for (int ii=1; ii<=M; ++ii)
    {
        f>>tip>>A;
        if (!tip) f>>B, update(A, B);
            else if (tip==1) f>>B, g<<query(B)-query(A-1)<<'\n';
                else
                {
                    int lg=pas, i=0, sol=-1;
                    for (; lg; lg>>=1)
                        if (i+lg<=N && aib[i+lg]<=A)
                        {
                            A-=aib[i+lg]; i+=lg;
                            if (A==0) { sol=i; break; }
                        }
                    g<<sol<<'\n';
                }
    }
    return 0;
}