Cod sursa(job #721229)

Utilizator algotrollNume Fals algotroll Data 23 martie 2012 14:35:46
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include<fstream>
#include<cmath>
//#include<algorithm>
#define _NM 100010
#define _TM 262144
using namespace std;

short nA, vA[_NM];

short i_tree[_TM];
short create_tree(short iNod, short le, short ri)
{
    if (le==ri) return i_tree[iNod]=vA[le];
    return i_tree[iNod]=
    create_tree(2*iNod,le,(le+ri)/2)+create_tree(2*iNod+1,(le+ri)/2+1,ri);
}

short update_tree(short iNod, short le, short ri, short poz)
{
    if (le==ri) return i_tree[iNod]=vA[le];
    if (le>poz||ri<poz) return i_tree[iNod];
    return i_tree[iNod]=update_tree(2*iNod,le,(le+ri)/2,poz)+update_tree(2*iNod+1,(le+ri)/2+1,ri,poz);
}

short sumq_tree(short iNod, short le, short ri, short i, short j)
{
    if (le>j||ri<i) return 0;
    if (le>=i&&ri<=j) return i_tree[iNod];
    return sumq_tree(2*iNod,le,(le+ri)/2,i,j)+sumq_tree(2*iNod+1,(le+ri)/2+1,ri,i,j);
}

short kq_tree(short iNod, short le, short ri, short sum)
{
    if (sum==i_tree[iNod]) return ri;
    if (le==ri||sum<0||sum>i_tree[iNod]) return -1;
    return max(kq_tree(iNod*2,le,(le+ri)/2,sum),kq_tree(2*iNod+1,(le+ri)/2+1,ri,sum-i_tree[2*iNod]));
}

int main()
{
    ifstream fin("aib.in");
    ofstream fout("aib.out");
    short nOp; fin>>nA>>nOp;
    for (short i=1;i<=nA;i++)
        fin>>vA[i];
    create_tree(1,1,nA);
    for (short i=1;i<=nOp;i++)
    {
        short op; fin>>op;
        switch(op)
        {
        case 0:
            short poz,val;
            fin>>poz>>val; vA[poz]+=val;
            update_tree(1,1,nA,poz);
            break;
        case 1:
            short a,b;
            fin>>a>>b;
            fout<<sumq_tree(1,1,nA,a,b)<<'\n';
            break;
        case 2:
            short sum; fin>>sum;
            fout<<kq_tree(1,1,nA,sum)<<'\n';
        }
    }
    return 0;
}