Cod sursa(job #2159619)

Utilizator Tataru_AdelinTataru Adelin Tataru_Adelin Data 11 martie 2018 03:32:10
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

void Update(unsigned i, int val,vector<int>&aib)
{
    //i=i+1;
    for(;i<=aib.size()-1;i=i+(i&(-i)))
    {
        aib[i]+=val;
    }
}

int Query(unsigned i, vector<int>&aib)
{
    int ans=0;
    //i=i+1;
    for(;i>0;i=i-(i&(-i)))
    {
        ans+=aib[i];
    }
    return ans;
}

int Search(int val,vector<int>&aib)
{
    int i=0,j=(1<<(31-__builtin_clz(aib.size()-1)));
    for(;j>0;j>>=1)
    {
        if(i+j<=(int)aib.size()-1)
        {
            if(val>=aib[i+j])
            {
                i+=j;
                val-=aib[i];
                if(val==0)
                {
                    return i;
                }
            }
        }
    }

    return -1;

}

int main()
{
    int n,m,x;
    fin>>n>>m;
    vector<int>aib(n+2,0);
    for(int i=1;i<=n;i++)
    {
        fin>>x;
        Update(i,x,aib);
    }

    int a,b;
    for(;m;m--)
    {
        fin>>x;
        switch(x)
        {
        case 0:
            fin>>a>>b;
            Update(a,b,aib);
            break;
        case 1:
            fin>>a>>b;
            fout<<Query(b,aib)-Query(a-1,aib)<<'\n';
            break;
        case 2:
            fin>>a;
            fout<<Search(a,aib)<<'\n';
            break;

        }
    }
    return 0;
}