Cod sursa(job #2700387)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 27 ianuarie 2021 16:09:05
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>

const int MAXN = 100000 + 1;

using namespace std;

typedef long long ll;

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

int n,q;
ll aib[MAXN];

int mub(int x){
    return ((x ^ (x - 1)) & x);
}
ll suma(int x){
    /// suma pe intervalul (0,x]
    ll s = 0;
    while(x){
        s += aib[x];
        x -= mub(x);
    }
    return s;
}
void update(int pos,int val){
    while(pos <= n){
        aib[pos] += 1ll * val;
        pos += mub(pos);
    }
}
int cautbinar(int suma){
    int index = 0;
    int pas = 1<<16;
    ll suma_curenta = 0;
    while(pas){
        if(index + pas <= n && suma_curenta + aib[index + pas] <= 1ll * suma){
            index += pas;
            suma_curenta += aib[index];
//            cout<<suma_curenta<<endl;
//            cout<<"OK "<<pas<<" "<<aib[index + pas]<<endl;
        }
        pas /= 2;
    }
    if(suma_curenta == suma)
        return index;
    return -1;
}

int main()
{

    in>>n>>q;
    for(int i = 1; i <= n; i++){
        int val;
        in>>val;
        update(i,val);
    }
    for(int i = 1; i <= q; i++){
        int tip;
        in>>tip;
        if(tip == 0){
            int pos,val;
            in>>pos>>val;
            update(pos,val);
        }else if(tip == 1){
            int a,b;
            in>>a>>b;
            out<<suma(b) - suma(a - 1)<<'\n';
        }else if(tip == 2){
            int suma;
            in>>suma;
            out<<cautbinar(suma)<<'\n';
        }
    }


    return 0;
}