Cod sursa(job #2329542)

Utilizator FredyLup Lucia Fredy Data 26 ianuarie 2019 21:53:14
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define limn 100010
int n,m;
int vaib[limn];

void add(int poz, int val)
{
    for(; poz<=n; poz+=(poz&(-poz)))
        vaib[poz]+=val;
}

int query(int poz)
{
    int val=0;
    for(; poz>=1; poz-=(poz&(-poz)))
        val+=vaib[poz];
    return val;
}

int pozmin(int val)
{
    int mask, poz;
    for(mask=1; mask<=n; mask<<=1);
    mask>>=1;
    for(poz=0; mask; mask>>=1)
        if(poz+mask<=n)
            if(vaib[poz+mask]<=val)
            {
                val-=vaib[poz+mask];
                poz+=mask;
                if(!val)    return poz;
            }
    return -1;
}

int main()
{
    int x,j,q,a,b;
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        fin>>x;
        for(j=i; j<=n; j+=(j&(-j)))
            vaib[j]+=x;
    }

    while(m--)
    {
        fin>>q;
        if(q==0)
        {
            fin>>a>>b;
            add(a,b);
        }
        else if(q==1)
        {
            fin>>a>>b;
            fout<<query(b)-query(a-1)<<'\n';
        }
        else if(q==2)
        {
            fin>>a;
            fout<<pozmin(a)<<'\n';
        }
    }

    fin.close();
    fout.close();
    return 0;
}