Cod sursa(job #2392896)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 30 martie 2019 16:14:13
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <cstdio>

#define N 100005
#define uint unsigned int

using namespace std;

int n,m,c,a,b;
uint aib[N];

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

uint suma(int poz){
    uint ret = 0;
    for(int i=poz;i>0;i-=(i&(-i)))
        ret+=aib[i];
    return ret;
}

int cautbin(int val){
    int start, putere;
    for(putere=1;putere<n;putere*=2);
    for(start=0;putere && val; putere/=2)
        if(start+putere<=n && aib[start+putere]<=val){
            start+=putere;
            val-=aib[start];
        }
    if(val)
        return -1;
    return start;
}

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", &a);
        actualiazare(a,i);
    }
    for(int i=0;i<m;++i){
        scanf("%d%d", &c,&a);
        if(c<2){
            scanf("%d",&b);
            if(c==0)
                actualiazare(b,a);
            else
                cout<<suma(b)-suma(a-1)<<"\n";
        }
        else
            cout<<cautbin(a)<<"\n";
    }

    return 0;
}