Cod sursa(job #3261255)

Utilizator AdrianRosuRosu Adrian Andrei AdrianRosu Data 4 decembrie 2024 22:24:30
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>
#define DIM 100001

using namespace std;

ifstream fin("aib.in");

ofstream fout("aib.out");

int n, i, x, a, b, Q, task;

int v[DIM], bit[DIM];

int lsb(int n){

    return (n & -n);

}

void Update(int i, int val){

    for(; i <= n ; i += lsb(i))

        bit[i] += val;

}

int Query(int i){

    int ret = 0;

    for(; i >= 1 ; i -= lsb(i))

        ret += bit[i];

    return ret;

}

int binary_lifting(){

    int ret = 0;

    int temp = 0;

    for(i=log2(n);i>=0;i--){

        if(ret + (1LL << i) <= n && temp + bit[ret + (1LL << i)] <= a){

            ret += (1LL << i);

            temp += bit[ret + (1LL << i)];

        }

    }

    if(Query(ret) == a)

        return ret;

    return -1;

}

int main(){

    fin >> n >> Q;

    for(i=1;i<=n;i++){

        fin >> v[i];

        Update(i, v[i]);

    }

    while(Q--){

        fin >> task;

        if(task == 0){

            fin >> a >> b;

            Update(a, b - v[i]);

            v[i] = b;

        }

        else if(task == 1){

            fin >> a >> b;

            fout << Query(b) - Query(a - 1) << "\n";

        }

        else {

            fin >> a;

            fout << binary_lifting() << "\n";

        }

    }

}