Cod sursa(job #2445337)

Utilizator IoanaDraganescuIoana Draganescu IoanaDraganescu Data 3 august 2019 17:39:26
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int n, m, aib[100005];

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

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

int pozmin(int sum){
    int poz = 0;
    for (int i = 1 << 17; i > 0; i >>= 1)
        if ((poz | i) <= n && sum >= aib[poz | i]){
            poz |= i;
            sum -= aib[poz];
        }
    if (sum != 0)
        return -1;
    return poz;
}

int main(){
    fin >> n >> m;
    for (int i = 1; i <= n; i++){
        int x;
        fin >> x;
        update(i, x);
    }
    while (m--){
        int op;
        fin >> op;
        if (op < 2){
            int a, b;
            fin >> a >> b;
            if (op == 0)
                update(a, b);
            else
                fout << sum(b) - sum(a - 1) << '\n';
        }
        else{
            int a;
            fin >> a;
            fout << pozmin(a) << '\n';
        }
    }
    return 0;
}