Cod sursa(job #1519161)

Utilizator sebinechitasebi nechita sebinechita Data 6 noiembrie 2015 22:03:55
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define MAX 100100
#define cout fout
int n, aib[MAX], m, i, x, t, y, st, dr, ok, amij;

void update(int p, int val)
{
    while(p <= n)
    {
        aib[p] += val;
        p += (p & -p);
    }
}

int query(int p)
{
    int s = 0;
    while(p)
    {
        s += aib[p];
        p -= (p & -p);
    }
    return s;
}



int main()
{
    fin >> n >> m;
    for(i = 1 ; i <= n ; i++)
    {
        fin >> x;
        update(i, x);
    }
    while(m--)
    {
        fin >> t;
        if(t == 0)
        {
            fin >> x >> y;
            update(x, y);
        }
        else if(t == 1)
        {
            fin >> x >> y;
            cout << query(y) - query(x - 1) << "\n";
        }
        else
        {
            fin >> x;
            st = 1;
            dr = n;
            ok = 0;
            while(st <= dr)
            {
                int mij = (st + dr) >> 1;
                amij = query(mij);
                if(amij == x)
                {
                    ok = mij;
                    dr = mij - 1;
                }
                else if(amij < x)
                {
                    st = mij + 1;
                }
                else
                {
                    dr = mij - 1;
                }
            }
            if(ok)
                cout << ok << "\n";
            else
                cout << "-1\n";
        }
    }
}