Cod sursa(job #609879)

Utilizator mihai995mihai995 mihai995 Data 23 august 2011 18:05:01
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
using namespace std;

const int N=100005;
long long v[N];
int n;

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

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

void update(int x,int val)
{
    for (;x<=n;x+=next(x))
        v[x]+=val;
}

long long query(int x)
{
    if (!x)
        return 0;
    long long val=0;
    for (;x>0;x-=next(x))
        val+=v[x];
    return val;
}

int bs(int x)
{
    int i,step=1<<16;
    for (i=0;step;step>>=1)
        if (i+step<=n && v[i+step]<=x)
        {
            i+=step;
            x-=v[i];
        }
    return !x ? i : -1;
}

int main()
{
    int q,x,y;
    in>>n>>q;
    for (int i=1;i<=n;i++)
    {
        in>>x;
        update(i,x);
    }
    while (q--)
    {
        in>>x;
        if (x==0)
        {
            in>>x>>y;
            update(x,y);
            continue;
        }
        if (x==1)
        {
            in>>x>>y;
            out<<query(y)-query(x-1)<<"\n";
            continue;
        }
        in>>x;
        out<<bs(x)<<"\n";
    }
    return 0;
}