Cod sursa(job #2393096)

Utilizator andreiudilaUdila Andrei andreiudila Data 30 martie 2019 19:57:45
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#define lsb(x) x&(-x)
#include <fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");

int n,m,x,a,b,q;
int aib[100100];


void update(int poz, int val)
{
    for(int i=poz;i<=n; i+=lsb(i))
        aib[i]+=val;
}
int query(int poz)
{
    int ans = 0;
    for(int i=poz;i; i-=lsb(i))
        ans+=aib[i];

    return ans;
}

int solve_2(int a)
{

    int l = 1, r = n;
    while(l<=r)
    {
        int mid = (l+r)/2;

        if(query(mid) > a) r = mid-1;
        else l = mid+1;
    }

    if(query(r) == a)
    return r;
    else return -1;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;++i)
    {
        cin>>x;
        update(i,x);
    }

    while(m--)
    {
        cin>>q;
        if(q==0)
        {
            cin>>a>>b;
            update(a,b);
        }
        else if(q==1)
        {
            cin>>a>>b;
            cout<<query(b) - query(a-1)<<"\n";
        }
        else
        {
            cin>>a;
            cout<<solve_2(a)<<"\n";
        }
    }
    return 0;
}