Cod sursa(job #1144611)

Utilizator addy01adrian dumitrache addy01 Data 17 martie 2014 12:55:38
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int maxn = 100000;
int AIB[maxn];
int n;
int lsb(const int &x)
{
    return x&(-x);
}

void Update(int poz,int val)
{
    for( ; poz <= n ; poz += lsb(poz) )
        AIB[poz]+=val;
}

int Query(int poz)
{
    int Ans=0;
    for( ; poz ; poz -= lsb(poz))
        Ans+=AIB[poz];
    return Ans;
}

int BS(int x)
{
    int i=n,step;
    for(step = 1 ; step <= n ; step <<= 1);
    for( ; step ; step >>= 1)
        if( i-step >= 1 && Query(i-step) >= x)
            i-=step;

    if(Query(i)==x)
        return i;
    return -1;

}
int main()
{
    int tip,i,m,x,y;
    in>>n>>m;
    for(i=1;i<=n;i++)
        {
            in>>x;
            Update(i,x);
        }
    while(m--)
    {
        in>>tip;
        if(!tip)
        {
            in>>x>>y;
            Update(x,y);
        }
        else
            if(tip==1)
            {
                in>>x>>y;
                out<<Query(y)-Query(x-1)<<"\n";
            }
            else
            {
                in>>x;
                out<<BS(x)<<"\n";
            }
    }
    return 0;
}