Cod sursa(job #3231275)

Utilizator andreea678Rusu Andreea-Cristina andreea678 Data 25 mai 2024 15:32:01
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int MAXN = 100005;
int n, m, v[4*MAXN], x;
int tip, a, b;

void update(int nod, int poz, int st, int dr, int val) {
    if (st == dr) {
        v[nod] += val;
        return;
    }
    int m = (st + dr) / 2;
    if (poz <= m) {
        update(nod * 2, poz, st, m, val);
    } else {
        update(nod * 2 + 1, poz, m + 1, dr, val);
    }
    v[nod] = v[nod * 2] + v[nod * 2 + 1];
}

int sum(int nod, int st, int dr, int qst, int qdr) {
    if (qst > dr || qdr < st) {
        return 0;
    }
    if (qst <= st && dr <= qdr) {
        return v[nod];
    }
    int m = (st + dr) / 2;
    int s1 = sum(nod * 2, st, m, qst, qdr);
    int s2 = sum(nod * 2 + 1, m + 1, dr, qst, qdr);
    return s1 + s2;
}
int findK(int a) {
    int left = 1, right = n, result = -1;
    while (left <= right) {
        int mid = (left + right) / 2;
        int currentSum = sum(1, 1, n, 1, mid);
        if (currentSum == a) {
            result = mid;
            break;
        } else if (currentSum < a) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return result;
}
int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        fin >> x;
        update(1, i, 1, n, x);
    }
    for (int i = 1; i <= m; ++i) {
        fin >> tip;
        if (tip!=2){
            fin >> a >> b;
        }
        else {
            fin >> a;
        }
        if (tip == 0) {
            update(1, a, 1, n, b);
        }
        else if (tip == 1) {
            fout << sum(1, 1, n, a, b) << '\n';
        }
        else if (tip==2){
            fout << findK(a) << '\n';
        }
    }
    return 0;
}