Cod sursa(job #1161919)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 31 martie 2014 15:31:04
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#define Nmax 100009
#define LSB(x) (x&(-x))
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");

int N,M,P,AIB[Nmax],val;

inline void Update(int poz,int x)
{
    for(int i=poz;i<=N;i+=((-i)&i))
        AIB[i]+=x;
}

inline int S(int poz)
{
    int aux=0;
    for(int i=poz; i>0; i-=((-i)&i))
        aux+=AIB[i];
    return aux;
}


inline int  Search(int val)
{
    for(int i=0,pas=P;  pas;  pas>>=1)
        if(i+pas<=N && AIB[i+pas]<=val)
        {
            i+=pas , val-=AIB[i];
            if(!val)return i;
        }
    return -1;
}
int main()
{
    f>>N>>M;
    for(P=1; P<N; P<<=1);
    for(int i=1;i<=N;++i)
        f>>val , Update(i,val);
    for(int i=1;i<=M;++i)
    {
        int op,a,b,val,poz;
        f>>op;
        if(!op)   f>>poz>>val , Update(poz,val);
        if(op==1) f>>a>>b, g<<S(b)-S(a-1)<<'\n';
        if(op==2) f>>val , g<<Search(val)<<'\n';
    }
    f.close();g.close();
    return 0;
}