Cod sursa(job #3192720)

Utilizator FredyLup Lucia Fredy Data 13 ianuarie 2024 10:48:05
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define limn 100010

int tree[limn];
int n, m, a, b, qtype, x;

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

int sum(int poz) {
    int result = 0;
    for(int i = poz; i > 0; i -= i&(-i))
        result += tree[i];
    return result;
}

int minPos(int val) {
    int mask = 1;
    while(mask <= n) mask<<=1;
    mask>>=1;
    
    int position = 0;
    for(; mask > 0; mask >>= 1) {
        if(position + mask <= n && tree[position+mask] <= val) {
            val -= tree[position + mask];
            position += mask;
            if(val == 0)
                return position;
        }
    }
    return position;
}

int main()
{
    fin>>n>>m;
    for(int i = 1; i <= n; i++) { // citim sirul si construim arborele initial
        fin>>x;
        for(int j = i; j <= n; j += (j&(-j)))
            tree[j] += x;
    }
    
    while(m--) {
        fin>>qtype;
        if(qtype == 0) {
            fin>>a>>b;
            add(a, b);
        }
        if(qtype == 1) {
            fin>>a>>b;
            fout<<sum(b)-sum(a-1)<<'\n';
        }
        if(qtype == 2) {
            fin>>a;
            fout<<minPos(a)<<'\n';
        }
    }
    
    fin.close();
    return 0;
}