Cod sursa(job #999397)

Utilizator AeroHHorea Stefan AeroH Data 20 septembrie 2013 10:00:34
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#define zero(x) ( (x ^ (x - 1)) & x )
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");

int i,j,k,n,q,r,aib[300000],v[150001],sumep[150001],a,b,x;

void sum(int loc,int val)
{
    int i;
    for (i=loc;i<=n;i+=zero(i))
    aib[i]+=val;
}

int query(int val)
{
    int i;
    int suma=0;
    for (i=val;i>0;i-=zero(i))
    suma+=val;
    return suma;
}

int search(int val)
{
    int i,s;
    for (s=1;s<=val;s<<=1);
    for (i=0;s;s>>=1)
    if (sumep[i+s]<=val&&i+s<=n)
    i+=s;
    return i;
}

int main()
{
    fin>>n>>q>>r;
    for (i=1;i<=n;++i)
    {
        fin>>v[i];sum(i,v[i]);
        sumep[i]=sumep[i-1]+v[i];
    }
    for (i=1;i<=q;++i)
    {
        fin>>r;
        if (!r)
        {
            fin>>a>>b;
            sum(a,b);
        }
        else if(r==1)
        {
            fin>>a>>b;
            fout<<(query(b)-query(a-1))<<'\n';
        }
        else if (r==2)
        {
            fin>>a;
            x=search(a);
            if (sumep[x]==a)
            fout<<x<<'\n';
            else fout<<"-1\n";
        }
    }
    return 0;
}