Cod sursa(job #3197949)

Utilizator Allie28Radu Alesia Allie28 Data 27 ianuarie 2024 18:35:47
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <stack>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");

const int LMAX = 100005;
int v[LMAX], aib[LMAX], n;

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

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

int findk(int sum) {
    int st, dr, mij;
    st = 0; dr = n;
    while (st + 1 != dr) {
        mij = (st + dr) >> 1;
        if (query(mij) < sum) {
            st = mij;
        }
        else {
            dr = mij;
        }
    }
    return dr;
}

int main() {
    int m, i;
    fin>>n>>m;
    for (i = 1; i <= n; i++) {
        fin>>v[i];
        update(i, v[i]);
    }
    int op, a, b;
    while (m--) {
        fin>>op;
        if (op == 0) {
            fin>>a>>b;
            v[a]+=b;
            update(a, b);
        }
        else if (op == 1) {
            fin>>a>>b;
            fout<<query(b) - query(a-1)<<endl;
        }
        else {
            fin>>a;
            fout<<findk(a)<<endl;
        }
    }


    fin.close();
    fout.close();
    return 0;
}