Cod sursa(job #1017424)

Utilizator DaniEsDani Stetcu DaniEs Data 27 octombrie 2013 19:22:17
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#define NMax 100005
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N,M,S[NMax];
void Update(int P,int V)
{
    for(int i=P;i<=N;i+=i&(-i))
        S[i]+=V;
}
int Query(int P)
{
    int Sum=0;
    for(int i=P;i>0;i-=i&(-i))
        Sum+=S[i];
    return Sum;
}
 int Search(int V)
{
    int Step;
    for (Step = 1; Step < N; Step <<= 1);
    for(int i = 0; Step; Step >>= 1) {
        if (i+Step <= N && V >= S[i+Step]) {
            i += Step, V -= S[i];
            if (!V)
                return i;
        }
    }
    return -1;
}
int main()
{
    fin>>N>>M;
    for(int i=1;i<=N;i++)
        {
            int X;
            fin>>X;
            Update(i,X);
 
        }
    while(M--)
    {
        int op,a,b;
        fin>>op>>a;
        if(op!=2)
            fin>>b;
        if(op==0)
        {
            Update(a,b);
        }
        if(op==1)
        {
            fout<<Query(b)-Query(a-1)<<"\n";
        }
        if(op==2)
        {
            fout<<Search(a)<<"\n";
        }
    }
    return 0;
}