Cod sursa(job #2728382)

Utilizator Xutzu358Ignat Alex Xutzu358 Data 23 martie 2021 10:36:16
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;

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

int aib[100005];
int n, m;

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

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

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

int main()
{
    int op, a, b;
    f >> n >> m;
    for (int i=1; i<=n; i++) {
        f >> a;
        for(int j=i; j<=n; j += (j&(-j))) {
            aib[j] += a;
        }
    }
    for (int i=1;i<=m;i++) {
        f >> op;
        if (op == 0) {
            f>>a>>b;
            add(a, b);
        }
        else if (op == 1) {
            f >> a >> b;
            g << query(b) - query(a-1) << '\n';
        }
        else {
            f >> a;
            g << pozmin(a) << '\n';
        }
    }

    return 0;
}