Cod sursa(job #2590558)

Utilizator AndreeaGherghescuAndreea Gherghescu AndreeaGherghescu Data 28 martie 2020 13:29:26
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N=100001;
const int L=16;

int v[N],aib[N],n;

void actualizare (int p,int val)
{
    while (p<=n)
    {
        aib[p]+=val;
        p+=(p&(-p));
    }
}
int interogare (int p)
{
    int s=0;
    while (p!=0)
    {
        s+=aib[p];
        p-=(p&(-p));
    }
    return s;
}
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;
    }
    if (val>0)
        return -1;
    return p;
}
void construct (int val, int p)
{
    while (p<=n)
    {
        aib[p]+=val;
        p+=(p&(-p));
    }
}
int main()
{
    int cod,x,y,m;
    in>>n>>m;
    for (int i=1;i<=n;i++)
    {
        in>>v[i];
        construct (v[i],i);
    }
    for (int i=1;i<=m;i++)
    {
        in>>cod;
        if (cod==0)
        {
            in>>x>>y;
            actualizare (x,y);
        }
        else if (cod==1)
        {
            in>>x>>y;
            out<<interogare(y)-interogare(x-1)<<'\n';
        }
        else
        {
            in>>x;
            out<<caut (x)<<'\n';
        }
    }
    return 0;
}