Cod sursa(job #2920900)

Utilizator NebunuWeedCiucanu Stefan NebunuWeed Data 26 august 2022 15:09:19
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#define pbinfo
#define fl
//#define func

#ifdef pbinfo

#include <unordered_map>
#include <map>
#include <vector>
#include <cmath>
#include <set>

#ifdef fl

#include <fstream>

#else
#include <iostream>
#include <iomanip>
#endif

#ifdef func
#include "header.hpp"
#endif

#else

#include <bits/stdc++.h>

#endif
using namespace std;
 
#define lld long long int
#define ulld unsigned long long int
#define sh short
#define lwbit(x) (x & (-x))
#define mod 1234567

#ifdef fl
ifstream cin("aib.in");
ofstream cout("aib.out");
#endif

int n, m;
int fen[100001];

void update(int i, int x) {
    for (int k = i; k <= n; k += lwbit(k))
        fen[k] += x;
}

int sum(int i) {
    int s{};
    for (int k = i; k > 0; k -= lwbit(k))
        s += fen[k];
    return s;
}

int bin(int a) {
    int s, i;
    for (s = 1; s <= n; s <<= 1);
    for (i = 0; s; s >>= 1)
        if (i + s <= n && fen[i + s] <= a) {
            i += s;
            a -= fen[i];
            if (!a)
                return i;
        }
    return -1;
}

int main() {
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);

    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        int x;
        cin >> x;
        update(i, x);
    }

    while (m--) {
        int c, i, j;
        cin >> c;
        switch (c) {
        case 0:
            cin >> i >> j;
            update(i, j);
            break;
        case 1:
            cin >> i >> j;
            cout << sum(j) - sum(i - 1) << '\n';
            break;
        case 2:
            cin >> i;
            cout << bin(i) << '\n';
        }
    }
    
    return 0;
}