Cod sursa(job #1498595)

Utilizator refugiatBoni Daniel Stefan refugiat Data 8 octombrie 2015 20:18:39
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
#define len 100002
int aib[len];
inline void update(int i,int a)
{
    for(;i<len;i+=i&(-i))
        aib[i]+=a;
}
inline int query(int i)
{
    int sum=0;
    for(;i>0;i-=i&(-i))
        sum+=aib[i];
    return sum;
}
inline int caut(int n,int a)
{
    int poz=0,i=1<<17;
    for(;i>0;i>>=1)
    {
        if(i+poz<=n)
        {
            if(aib[poz+i]<=a)
            {
                poz+=i;
                a-=aib[poz];
                if(!a)
                    return poz;
            }
        }
    }
    return -1;
}
int main()
{
    ifstream si;
    si.open("aib.in");
    ofstream so;
    so.open("aib.out");
    int n,m;
    si>>n>>m;
    int i,a,b,c;
    for(i=0;i<n;++i)
    {
        si>>a;
        update(i+1,a);
    }
    for(i=0;i<m;++i)
    {
        si>>a;
        if(a==0)
        {
            si>>b>>c;
            update(b,c);
        }
        else
        {
            if(a==1)
            {
                si>>b>>c;
                so<<query(c)-query(b-1)<<'\n';
            }
            else
            {
                si>>b;
                so<<caut(n,b)<<'\n';
            }
        }
    }
    si.close();
    so.close();
    return 0;
}