Cod sursa(job #2757973)

Utilizator TraianQTraianQ TraianQ Data 7 iunie 2021 20:35:23
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#define L 16
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int n,m,op,a,b,v[100005],aib[100005];
int p2min(int i)
{
    int cate=0;
    while(i%2==0)
        cate++,i/=2;
    return (1<<cate);
}
int suma(int p)
{
    int s=0;
    while(p)
    {
        int p2=(p&(-p));
        s+=aib[p];
        p-=p2;
    }
    return s;
}
void actualizare(int p,int val)
{
    while(p<=n)
    {
        aib[p]+=val;
        int p2 = (p&(-p));
        p += p2;
    }
}
int caut(int val)
{
    int p=0,pas=1<<L;
    while(pas!=0)
    {
        if(p+pas<=n && aib[p+pas]<=val)
            p+=pas,val-=aib[p];
        pas/=2;
    }
    //cout << " --- " << p << " val = " << val << endl;
    if(p<=n && val == 0)
        return p;
    return -1;

}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int v;
        cin>>v;
        actualizare(i, v);
    }
    for(int i=1;i<=m;i++)
    {
        cin>>op;
        if(op==0)
        {
            cin>>a>>b;
            actualizare(a,b);
        }
        else if(op==1)
        {
            cin>>a>>b;
            cout<<suma(b)-suma(a-1)<<"\n";
        }
        else
        {
            cin>>a;
            cout<<caut(a)<<"\n";
        }
    }
    return 0;
}