Cod sursa(job #2070359)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 19 noiembrie 2017 14:32:46
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX = 100005;

int n, AIB[NMAX];

int zeros(int x)
{
    return x ^ (x & (x - 1));
}

void Update(int poz, int val)
{
    for (int i = poz; i <= n; i += zeros(i))
        AIB[i] += val;
}

int Query1(int poz)
{
    int rez = 0;
    for (int i = poz; i >= 1; i -= zeros(i)) rez += AIB[i];
    return rez;
}

int Query2(int x)
{
    int last = 0;
    int ramas = x;
    for (int i = 20; i >= 0; i--) //parcurg puterile
        if (last + (1 << i) <= n && AIB[last + (1 << i)] <= ramas) //continui
        {
            last += (1 << i);
            ramas -= AIB[last];
        }
    if(ramas == 0)
        return last;
    return -1;
}

int main()
{
    int m;
    in >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        int x;
        in >> x;
        Update(i, x);
    }

    for(int i = 1; i <= m; i++)
    {
        int p;
        in >> p;
        if(p == 0)
        {
            int poz, val;
            in >> poz >> val;
            Update(poz, val);
        }
        else if(p == 1)
        {
            int x, y;
            in >> x >> y;
            out << Query1(y) - Query1(x - 1) << "\n";
        }
        else
        {
            int x;
            in >> x;
            out << Query2(x) << "\n";
        }
    }


    return 0;
}