Cod sursa(job #2987655)

Utilizator DavidAA007Apostol David DavidAA007 Data 2 martie 2023 17:44:59
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include<fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
long long int n,m,arb[100005],k,a,b;
void update(long long int poz,long long int val)
{
    long c=0;
    while(poz<=n)
    {
        arb[poz]=arb[poz]+val;
        while(!(poz&(1<<c)))
            c++;
        poz=poz+(1<<c);
        c++;
    }
}
long long int query(long long int poz)
{
    long long int s=0,c=0;
    while(poz>0)
    {
        s=s+arb[poz];
        while(!(poz&(1<<c)))
            c++;
        poz=poz-(1<<c);
        c++;
    }
    return s;
}
long long int search(long long int val)
{
    long c=1,i=0;
    while(c<n)
     c=c<<1;
    while (c)
    {
        if(i+c<=n && val>=arb[i+c])
        {
            i=i+c;
            val=val-arb[i];
            if(!val)
             return i;
        }
        c=c>>1;
    }
    return -1;
}
int main()
{
    fin>>n>>m;
    long long int i,x;
    for (i=1;i<=n;i++)
    {
        fin>>x;
        update(i,x);
    }
    for (i=0;i<m;i++)
    {
        fin>>k;
        switch(k)
        {
            case 0:fin>>a>>b; update(a,b);break;
            case 1:fin>>a>>b; fout<<query(b)-query(a-1)<<"\n";break;
            case 2:fin>>a; fout<<search(a)<<"\n";break;
        }
    }
    return 0;
}