Cod sursa(job #931765)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 28 martie 2013 14:43:37
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#define In "aib.in"
#define Out "aib.out"
#define NMAX 100004
using namespace std;
int aib[NMAX];
/*
aib[i] este suma elementelor de la i-2^k+1 la i
unde k = numarul de zerouri terminale ale lui i
k =( i&(-i);
*/
int n;
//mareste sumele de la poz la n cu val
inline void Update(int poz,int val)
{
    while(poz<=n)
    {
        aib[poz]+=val;
        poz +=(poz&(-poz));
    }
}

//returneaza suma elementelor pana la pozitia poz
inline int Query(int poz)
{
    int sum = 0;
    while(poz>=1)
    {
        sum += aib[poz];
        poz -= (poz&(-poz));
    }
    return sum;
}

//returneaza cea mai din stanga pozitie pentru care
//suma elementelor pana la pozitia respectiva este sum
//folosind cautarea binara
inline int Bin(int sum)
{
    int st=1,dr=n,mijl,s;
    while(st<=dr)
    {
        mijl=(st+dr)>>1;
        s = Query(mijl);
        if(s==sum)
            return mijl;
        else
            if(s<sum)
                st =mijl+1;
            else
                dr = mijl-1;
    }
    return -1;
}

int main()
{
    int i,s1,s2,x,y,m,op;
    ifstream fin(In);
    fin>>n>>m;
    ofstream fout(Out);
    for(i=1;i<=n;i++)
    {
        fin>>x;
        Update(i,x);
    }
    while(m--)
    {
        fin>>op;
        if(op<2)
        {
            fin>>x>>y;
            if(op==0)
                Update(x,y);
            else
            {
                s1 = Query(y);
                s2 = Query(x-1);
                fout<<(s1-s2)<<"\n";
            }
        }
        else
        {
            fin>>x;
            y = Bin(x);
            fout<<y<<"\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}