Cod sursa(job #1809358)

Utilizator adystar00Bunea Andrei adystar00 Data 18 noiembrie 2016 21:04:21
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
using namespace std;
int s[100002],aib[100002],suma,n,m;
int ib (int n)
{
    return n&(-n);
}
void update(int x, int y)
{
    if(x>n)
        return;
    aib[x]+=y;
    x+=ib(x);
    update(x,y);
}
int query ( int x)
{
    int suma=0;
    while(x)
    {
        suma+=aib[x];
        x-=ib(x);
    }
    return suma;
}
int cautare (int val)
{
    int pas, i=0;
    for(pas=1; pas<n; pas <<=1);
    while(pas)
    {
        if(i+pas<=n)
            if(val>=aib[i+pas])
        {
            i+=pas;
            val-=aib[i];
            if(!val)
                return i;
        }
        pas>>=1;
    }
    return -1;
}
int main()
{
    ifstream fin ("aib.in");
    ofstream fout ("aib.out");
    int i,q,x,y;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        s[i]=s[i-1]+x;
        update(i,x);
    }
    for(i=1;i<=m;i++)
    {
        fin>>q;
        if(q==0)
        {
            fin>>x>>y;
            update(x,y);
        }
        if(q==1)
        {
            fin>>x>>y;
            suma=0;
            fout<<query(y)-query(x-1)<<"\n";
        }
        if(q==2)
        {
            fin>>x;
            fout<<cautare(x)<<"\n";
        }
    }
    return 0;
}