Cod sursa(job #2193522)

Utilizator raul044Moldovan Raul raul044 Data 10 aprilie 2018 14:13:55
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <fstream>
#define maxN 100005

using namespace std;

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

int n, m, arb[4*maxN+66], SUM;

void Update();
void Query();
int Search();

void Update (int nod, int left, int right, int val, int poz) {
    if (left == right) {
        arb[nod] += val;
        return;
    }
    int mid = (left+right)/2;
    if (poz <= mid)
        Update(2*nod, left, mid, val, poz);
    else
        Update(2*nod+1, mid+1, right, val, poz);
    arb[nod] = arb[2*nod] + arb[2*nod+1];
}

void Query (int nod, int left, int right, int a, int b) {
    if (a <= left and right <= b) {
        SUM += arb[nod];
    }
    else {
        int mid = (left+right)/2;
        if (a <= mid)
            Query(2*nod, left, mid, a, b);
        if (b > mid)
            Query(2*nod+1, mid+1, right, a, b);
    }
}

int Search (int left, int right, int val) {
    int mid = (left+right)/2;
    if (left <= right) {
        SUM = 0;
        Query(1, 1, n, 1, mid);
        if (val == SUM)
            return mid;
        if (val < SUM)
            return Search(left, mid-1, val);
        else
            return Search(mid+1, right, val);
    }
}

int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        int val;
        fin >> val;
        Update(1, 1, n, val, i);
    }
    int Q;

    for (int i = 1; i <= m; ++i) {
        fin >> Q;
        if (Q == 0) {
            int a, b;
            fin >> a >> b;

            Update(1, 1, n, b, a);
        }

        if (Q == 1) {
            int a, b;
            fin >> a >> b;
            SUM = 0;

            Query(1, 1, n, a, b);
            fout << SUM << '\n';
        }

        if (Q == 2) {
            int a;
            fin >> a;
            fout << Search(1, n, a) << '\n';
        }
    }

}