Cod sursa(job #2514355)

Utilizator ViAlexVisan Alexandru ViAlex Data 25 decembrie 2019 15:33:21
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include<bits/stdc++.h>
using namespace std;


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

int tree[100000],n,query_count;


int lsb(int a)
{
    return a&(-a);
}


void update(int index,int value)
{
    while(index<=n)
    {
        tree[index]+=value;
        index+=lsb(index);
    }
}

void read()
{
    in>>n>>query_count;
    int aux;
    for(int i=1; i<=n; i++)
    {
        in>>aux;
        update(i,aux);
    }
}



int query(int index)
{
    int result=0;
    while(index>0)
    {
        result+=tree[index];
        index-=lsb(index);
    }
    return result;
}


int b_search(int value)
{
    int left=1,right=n;


    while(left<right)
    {
        int middle=(left+right)/2;
        int comp=query(middle);

        if(value<=comp)
        {
            right=middle;
        }
        else
        {
            left=middle+1;
        }
    }
    if(query(left)==value)
    {
        return left;
    }
    return -1;
}


void solve()
{
    int q,a,b;
    for(int i=0; i<query_count; i++)
    {
        in>>q;
        if(q==0)
        {
            in>>a>>b;
            update(a,b);
        }
        else if(q==1)
        {
            in>>a>>b;
            out<<query(b)-query(a-1)<<'\n';
        }
        else
        {
            in>>a;
            out<<b_search(a)<<'\n';

        }

    }

}

int main()
{

    read();
    solve();
    return 0;
}