Cod sursa(job #1448191)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 6 iunie 2015 14:04:35
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
unsigned int a,b,n,m,caz,AIB[101001];
unsigned int zeros(int x)
{
    return ((x^(x-1))&x);
}
void bagval(unsigned int poz,unsigned int val)
{
    while(poz<=n)
    {
        AIB[poz]+=val;
        poz+=zeros(poz);
    }
}
unsigned int Query(unsigned int poz)
{
    unsigned int suma=0;
    while(poz)
    {
        suma+=AIB[poz];
        poz-=zeros(poz);
    }
    return suma;
}
int cauta(int val)
{
    unsigned int i,step;
    for (step = 1; step <= n; step <<= 1);
    step >>= 1;
    for (i=0; step; step >>= 1)
    {
        if (step <= n)
        {
            if(AIB[i+step]<=val)
            {
                i += step;
                val -= AIB[i];
                if (!val) return i;
            }
        }
    }
    return -1;
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++) {f>>a; bagval(i,a);}
    while(m--)
    {
        f>>caz;
        if(!caz) {f>>a>>b; bagval(a,b);}
        if(caz==1) {f>>a>>b; g<<Query(b)-Query(a-1)<<'\n';}
        if(caz==2) {f>>a; g<<cauta(a)<<'\n';}
    }
    g.close();
    return 0;
}