Cod sursa(job #1453339)

Utilizator ZenusTudor Costin Razvan Zenus Data 23 iunie 2015 12:25:13
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int NSIZE = 100000 + 10;

int x , i , N , le , ri , mid , s , type , M , p , a , b , f , crt;

class fenwick
{
    public :

    int aib[NSIZE];

    void init()
    {
        memset(aib,0,sizeof(aib));
    }

    int sum(int p)
    {
        int i , res = 0;

        for (i = p ; i > 0 ; i -= i & (-i))
        res += aib[i];

        return res;
    }

    void update(int x,int p)
    {
        int i;

        for (i = p ; i <= N ; i += i & (-i))
        aib[i] += x;
    }
};

fenwick aib;

int main()
{

fin >> N >> M;
aib.init();

for (i = 1 ; i <= N ; ++i)
{
    fin >> x;
    aib.update(x,i);
}

for (i = 1 ; i <= M ; ++i)
{
    fin >> type;

    if (type == 0)
    {
        fin >> p >> x;
        aib.update(x,p);
    }

    if (type == 1)
    {
        fin >> a >> b;
        fout << aib.sum(b) - aib.sum(a-1) << '\n';
    }

    if (type == 2)
    {
        fin >> s;
        f = N + 1;
        le = 1 , ri = N;

        while (le <= ri)
        {
            mid = (le + ri) >> 1;
            crt = aib.sum(mid);

            if (crt == s)
            f = min(f , mid);

            if (crt >= s)
            ri = mid - 1;
            else le = mid + 1;
        }

        if (f == N + 1) fout << "-1" << '\n';
        else fout << f << '\n';
    }
}

return 0;
}