Cod sursa(job #2805719)

Utilizator Xutzu358Ignat Alex Xutzu358 Data 21 noiembrie 2021 20:01:02
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

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

int aib[100005];
int n,m;
int x;
int p;
int a,b,k;

void create_aib() {
    f >> n >> m;
    for (int i=1;i<=n;i++) {
        f >> x;
        for (int j=i;j<=n;j += (j&-j)) {
            aib[j] += x;
        }
    }
}

void add(int a, int val) {
    for (int i=a;i<=n; i += (i&-i)) {
        aib[i] += val;
    }
}

int sum(int a) {
    int sm=0;
    for (int i=a;i>0; i -= (i&-i)) {
        sm += aib[i];
    }
    return sm;
}

int pozmin(int a) {
    int mask,poz=0;
    for (mask=1;mask<=n;mask*=2);
    mask /= 2;
    while (mask!=0) {
        if (poz+mask<=n) {
            if (a>=aib[poz+mask]) {
                a -= aib[poz+mask];
                poz += mask;
                if (a==0) {
                    return poz;
                }
            }
        }
        mask /= 2;
    }
    return -1;
}

void solve() {
    if (p==0) {
        f >> a >> b;
        add(a,b);
    }
    else if (p==1) {
        f >> a >> b;
        g << sum(b) - sum(a-1) << '\n';
    }
    else {
        f >> a;
        g << pozmin(a) << '\n';
    }
}

int main()
{
    create_aib();
    for (int o=1;o<=m;o++) {
        f >> p;
        solve();
    }
    return 0;
}