Cod sursa(job #2686202)

Utilizator TheGodFather2131Alexandru Miclea TheGodFather2131 Data 18 decembrie 2020 17:27:10
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
//ALEXANDRU MICLEA

#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <cstring>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <time.h>
#include <iomanip>
#include <deque>
#include <math.h>
#include <cmath>
#include <assert.h>
#include <stack>
#include <bitset>
#include <random>
#include <chrono>
#include <assert.h>

using namespace std;
using ll = long long;

#include <fstream>
//ifstream cin("input.in"); ofstream cout("output.out");
ifstream cin("aib.in"); ofstream cout("aib.out");

//VARIABLES

const int MAXM = 150005;
const int MAXN = 100005;
int n, m;
int v[MAXN];

vector <int> BIT(MAXN);

//FUNCTIONS

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

int query (int st, int dr){
    int L = 0, R = 0;
    for (int i = st - 1; i; i -= i & -i) L += BIT[i];
    for (int i = dr; i; i -= i & -i) R += BIT[i];

    return R - L;
}

int caut_bin(int val){
    int st = 1;
    int dr = n;
    int ans = -1;

    while(st <= dr){
        int mid = st + dr;
        mid /= 2;

        int res = query(1, mid);
        if (res == val){
            ans = mid;
            break;
        } 
        if (res > val) dr = mid - 1;
        else st = mid + 1;
    }
    return ans;
}

//MAIN

int main() {

    cin >> n >> m;

    for (int i = 1; i <= n; i++) {
        cin >> v[i];
        update(i, v[i]);
    }

    for (int i = 1; i <= m; i++){
        int tip; cin >> tip;
        if (tip == 0){
            int a, b; cin >> a >> b;
            update(a, b);
        }
        if (tip == 1){
            int a, b; cin >> a >> b;
            cout << query(a, b) << '\n';
        }
        if (tip == 2){
            int a; cin >> a;
            cout << caut_bin(a) << '\n';
        }
    }

    return 0;
}