Cod sursa(job #2307594)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 24 decembrie 2018 23:39:29
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100000
#define zeros(x) ((x ^ (x - 1)) & x)

int n;
int aib[MAXN + 1];
inline void add(int position, int value){
    for(int i = position; i <= n; i += zeros(i))
        aib[i] += value;
}

inline int query(int position){
    int ans = 0;
    for(int i = position; i > 0; i -= zeros(i))
        ans += aib[i];
    return ans;
}

inline int binarySearch(int value){
    int i, step;
    for(step = 1; step < n; step <<= 1);

    for(i = 0; step; step >>= 1)
        if(i + step <= n && value >= aib[i + step]){
            i += step, value -= aib[i];
            if(!value) return i;
        }
    return -1;
}

int main(){
    FILE*fi,*fo;
    fi=fopen("aib.in","r");
    fo=fopen("aib.out","w");
    int m, x, t, a, b;
    fscanf(fi,"%d%d", &n, &m);
    for(int i=1;i<=n;i++){
        fscanf(fi,"%d", &x);
        add(i, x);
    }
    for(int i=0;i<m;i++){
        fscanf(fi,"%d", &t);
        if(t==0){
            fscanf(fi,"%d%d", &a, &b);
            add(a, b);
        }
        else if(t==1){
            fscanf(fi,"%d%d", &a, &b);
            fprintf(fo,"%d\n", query(b)-query(a-1));
        }
        else{
            fscanf(fi,"%d", &a);
            fprintf(fo,"%d\n", binarySearch(a));
        }
    }
    fclose(fi);
    fclose(fo);
    return 0;
}