Cod sursa(job #2629491)

Utilizator MohamedXXXhaide sarpili MohamedXXX Data 21 iunie 2020 10:59:05
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>
using namespace std;
#define NMAX 100005

int spart[NMAX], tree[NMAX], n, m;

void update(int pos, int val) {
    for(int i = pos; i <= n; i++) {
        spart[i] += val;
    }
}

int getSum(int a, int b) {
    return spart[b] - spart[a - 1];
}

int search(int sum) {
    int left = 1, right = n, mink = NMAX;
    while(left <= right) {
        int middle = (left + right) / 2;
        if(spart[middle] == sum) {
            mink = min(middle, mink);
        }
        if(spart[middle] > sum) {
            right = middle - 1;
        } else {
            left = middle + 1;
        }
    }
    return mink;
}

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", &tree[i]);
        spart[i] = spart[i - 1] + tree[i];
    }

    for(int i = 1; i <= m; i++) {
        int op, a, b;
        scanf("%d%d", &op, &a);
        if(op == 0) {
            scanf("%d", &b);
            update(a, b);
        } else if(op == 1) {
            scanf("%d", &b);
            printf("%d\n", getSum(a, b));
        } else {
            printf("%d\n", search(a));
        }
    }
    return 0;
}