Cod sursa(job #944101)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 27 aprilie 2013 13:44:32
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
using namespace std;

const int MAX_N = 100004;

int N, M;
int A[MAX_N];

inline void Update(int pos, int val){
    int Nr0 = 0;

    while(pos <= N){
        A[pos] += val;
        while(!(pos & (1 << Nr0)))
            ++Nr0;
        pos += (1 << Nr0);
        ++Nr0;
    }
}

inline int Query(int pos){
    int Nr0 = 0, Sum = 0;

    while(pos > 0){
        Sum += A[pos];
        while(!(pos & (1 << Nr0)))
            ++Nr0;
        pos -= (1 << Nr0);
        ++Nr0;
    }

    return Sum;
}

inline int BS(int val){
    int left = 0, mid = 0, right = N+1;

    while(left < right){
        mid = (left+right)/2;
        if(Query(mid) > val)
            right = mid;
        else left = mid+1;
    }

    if(Query(left-1) != val)
        return -1;
    return left-1;
}


int main(){
    ifstream f("aib.in");
    ofstream g("aib.out");

    f >> N >> M;
    for(int i = 1, x = 0; i <= N; ++i){
        f >> x;
        Update(i, x);
    }

    for(int q = 1; q <= M; ++q){
        int t, p, x, a, b, Res;

        f >> t;

        if(!t){
            f >> p >> x;
            Update(p, x);
        }
        else if(t == 1){
            f >> a >> b;
            Res = Query(b) - Query(a-1);
        }
        else{
            f >> x;
            Res = BS(x);
        }

        if(t >= 1)
            g << Res << '\n';
    }

    f.close();
    g.close();

    return 0;
}