Cod sursa(job #2341413)

Utilizator raducostacheRadu Costache raducostache Data 11 februarie 2019 19:57:30
Problema Arbori indexati binar Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>

using namespace std;

int aib[100005], n, v[100005];

void update(int a, int b){
    int pos;
    for(pos = a ; pos <= n ; pos += (pos & (-pos))){
        aib[pos] += b;
    }
}
int query(int x){
    int pos, ans = 0;
    for(pos = x ; pos ; pos -= (pos & (-pos))){
        ans += aib[pos];
    }
    return ans;
}
int main() {
    FILE *f = fopen("aib.in", "r");
    FILE *g = fopen("aib.out","w");
    int q, i, cer, a, b;
    fscanf(f, "%d %d\n", &n, &q);
    for(i = 1 ; i <= n ; ++i){
        fscanf(f, "%d ", v + i);
        update(i, v[i]);

    }
    while(q--){
        int pos;
        fscanf(f, "%d %d", &cer, &a);
        if(cer == 0 || cer == 1){
            fscanf(f, "%d", &b);
        }
        if(cer == 0){
            update(a, b);
        }
        else{
            if(cer == 1){
                fprintf(g, "%d\n", query(b) - query(a - 1));
            }
            else{
                for(pos = 1 ; pos < n ; pos <<= 1);
                for(i = 0 ; pos ; pos >>= 1)
                    if(i + pos <= n && query(i + pos) < a)
                        i += pos;
                if(query(i + 1) == a)fprintf(g, "%d\n", i + 1);
            }
        }
    }
    return 0;
}