Cod sursa(job #2416372)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 27 aprilie 2019 14:22:52
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <cstdio>

#define N 100005

using namespace std;

int aib[N];
int n,m,x,y,c;

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

int caut(int poz){
    int rez = 0;
    for(int i = poz; i >= 1; i-=i&(-i))
        rez+=aib[i];
    return rez;
}

int cautBin(int val){
    int start = 0;
    int baza = 1;
    for(baza; baza<=n; baza<<=1);
    for(baza;baza;baza>>=1)
        if(start+baza<=n && aib[start+baza]<=val){
            val -= aib[start+baza];
            start+=baza;
            if(val==0)
                return start;
        }
    return -1;
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    scanf("%d%d", &n,&m);
    for(int i = 1; i <= n; ++i){
        scanf("%d", &x);
        actualizare(i,x);
    }

    for(int i = 0; i < m; ++i){
        scanf("%d%d", &c,&x);
        if(c<2){
            scanf("%d", &y);
            if(c==0)
                actualizare(x,y);
            else
                cout<<caut(y)-caut(x-1)<<"\n";
        }else
            cout<<cautBin(x)<<"\n";
    }

    return 0;
}