Cod sursa(job #1100582)

Utilizator dropsdrop source drops Data 7 februarie 2014 00:17:40
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <algorithm>
#define MAX 100005

int A[MAX], N, M, X, Y, Op;

void Update(int idx, int val){
    while (idx <= N){
        A[idx] += val;
        idx += idx & -idx;
    }
}

int Query(int idx){
    int R = 0;
    while (idx > 0){
        R += A[idx];
        idx -= idx & -idx;
    }
    return R;
}

int CautBin(int val){
    int Left = 1, Right = N, Middle;
    while (Right - Left > 1){
        Middle = (Left + Right) / 2;
        if (Query(Middle) < val) Left = Middle; else Right = Middle;
    }
    return Query(Left) == X ? Left : Query(Right) == X ? Right : -1;
}

int main(){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d", &N, &M);
    for (int i = 1; i <= N; i++)
    {
        scanf("%d", &X);
        Update(i, X);
    }
    for (int i = 0; i < M; i++){
        scanf("%d", &Op);
        if (Op == 0){
            scanf("%d %d", &X, &Y);
            Update(X, Y);
        }
        else if (Op == 1){
            scanf("%d %d", &X, &Y);
            if (X > Y) std::swap(X, Y);
            printf("%d\n", Query(Y) - Query(X - 1));
        }
        else {
            scanf("%d", &X);
            printf("%d\n", CautBin(X));
        }
    }
}