Cod sursa(job #1776534)

Utilizator Kln1000Ciobanu Bogdan Kln1000 Data 11 octombrie 2016 14:57:04
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>

using namespace std;

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

int v[100010],n,lg;

void update(int a,int b)
{
    for(int i=a;i<=n;i+=i&(-i)) v[i]+=b;
}

int query(int a)
{
    int s=0;
    for(int i=a;i>=1;i-=i&(-i)) s+=v[i];
    return s;
}

int binsearch(int target)
{
    int x=0;
    for(int i=lg;i>=0;i--)
        if(x+(1<<i)<=n and v[x+(1<<i)]<target)
        {
            x+=1<<i;
            target-=v[x];
        }
    return x+1;
}

int main()
{int m,a,b,q;
    f>>n>>m;
    for(lg=1;(1<<lg)<=n;++lg);--lg;
    for(int i=0;i<n;++i)
    {
        f>>a;
        update(i,a);
    }
    for(int i=0;i<m;i++)
    {
        f>>q;
        if(!q)
        {
            f>>a>>b;
            update(a,b);
        }
        else if(q==1)
        {
            f>>a>>b;
            t<<query(b)-query(a-1)<<'\n';
        }
        else
        {
            f>>a;
            int k=binsearch(a);
            if(query(k)==a) t<<k<<'\n';
            else t<<-1<<'\n';
        }
    }
    return 0;
}