Cod sursa(job #2170181)

Utilizator FredyLup Lucia Fredy Data 14 martie 2018 22:40:55
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define lim 100010
int n,m;
int aib[lim];

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

int summ (int poz)
{
    int rez=0;
    for (; poz>0; poz-=(poz&(-poz)))
        rez += aib[poz];
    return rez;
}

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

int main()
{
    int tip,x,y;

    fin>>n>>m;
    for (int i=1; i<=n; i++)
    {
        fin>>x;
        add (i, x);
    }

    for (int i=1; i<=m; i++)
    {
        fin>>tip;
        if (tip==0)  /// valoarea el de pe poz x i se adauga y
        {
            fin>>x>>y;
            add (x, y);
        }
        else if (tip==1) /// suma el din [x,y]
        {
            fin>>x>>y;
            fout << summ (y) - summ (x-1)<<'\n';
        }
        else if (tip==2)    /// poz min k a.i. suma val primilor k termeni sa fie exact x
        {
            fin>>x;
            fout << findd (x) <<'\n';
        }
    }

    return 0;
}