Cod sursa(job #957239)

Utilizator rares96cheseliRares Cheseli rares96cheseli Data 4 iunie 2013 17:48:56
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");

int n, aib[100005], m;

inline int zero(int &x) { return x & -x;}

void update(int position, int value)
{
    while (position<=n)
    {
        aib[position]+=value; position+=zero(position);
    }
}
int query(int position)
{
    int ans=0;
    while (position)
    {
        ans+=aib[position]; position-=zero(position);
    }
    return ans;
}
int main()
{
    int x; f>>n>>m;
    for (int i=1; i<=n; i++) f>>x, update(i, x);

    for (int i=1; i<=m; i++)
    {
        int tip; f>>tip;
        if (tip==0)
        {
            int pos, val; f>>pos>>val;
            update(pos, val);
        }
        else if (tip==1)
        {
            int left, right; f>>left>>right;
            g<<query(right)-query(left-1)<<'\n';
        }
        else
        {
            int x, q, ans=0; f>>x; q=x;
            for (int i=1<<16; i>0; i>>=1)
               if (i+ans<=n && aib[ans+i]<x)
               {
                   x-=aib[ans+i]; ans+=i;
               }
            ++ans;
            if (ans!=-1 && query(ans)!=q) ans=-1;
            g<<ans<<'\n';
        }
    }
    return 0;
}