Cod sursa(job #1509445)

Utilizator kiunyAndrei Gavrila kiuny Data 23 octombrie 2015 21:24:29
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <vector>
using namespace std;

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

vector <int> aib;
int n, m;
int q, a, b;


void update(int i, int ad)
{
    for(; i <= n; i += i&(-i)) aib[i] += ad;
}
int query(int i)
{
    int ans = 0;
    for(; i > 0; i -= i&(-i)) ans += aib[i];
    return ans;
}

int getFirst(int sum)
{
    int l, r, q, m;
    l = 1;
    r = n;

    while(l <= r)
    {
        m = (l+r) >> 1;
        q = query(m);
        if(sum == q)
        {
            return m;
        }
        if(q < sum) l = m+1;
        else r = m-1;
    }
    return -1;
}


int main()
{
    cin >> n >> m;
    aib.resize(n+1, 0);

    for(int i = 1; i <= n; i++)
    {
        cin >> q;
        update(i, q);
    }

    for(int i = 0; i < m; i++)
    {
        cin >> q;
        if(q == 0)
        {
            cin >> a >> b;
            update(a, b);
        }
        else if(q == 1)
        {
            cin >> a >> b;
            cout << query(b) - query(a-1) << "\n";
        }
        else
        {
            cin >> a;
            cout << getFirst(a) << "\n";
        }
    }
    return 0;
}