Cod sursa(job #957236)

Utilizator Johny_Depp22Johnny Depp Johny_Depp22 Data 4 iunie 2013 17:46:44
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int n, aib[100005], m;

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)
                 if (aib[ans+i]<x)
                 {
                     x-=aib[ans+i]; ans+=i;
                 }
            ++ans;
            if (ans!=-1 && query(ans)!=q) ans=-1;

            g<<ans<<'\n';
        }
    }
    return 0;
}