Cod sursa(job #2394103)

Utilizator DimaTCDima Trubca DimaTC Data 1 aprilie 2019 12:21:40
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include<bits/stdc++.h>
#define N 100020
using namespace std;

int n,m;
int a[N], bit[N];

void update(int i, int val) {
    for (; i<=n; i+=i&(-i)) {
        bit[i]+=val;
    }
}

int query(int i) {
    int s=0;
    for (; i; i-=i&(-i)) {
        s+=bit[i];
    }
    return s;
}

int get(int v) {
    int st=1;
    for (st; st<=n; st*=2);
    for (int i=0; i<=n && st; st/=2) {
        if (i+st<=n) {
            if (bit[i+st]<=v) {
                i+=st;
                v-=bit[i];
                if (!v) return i;
            }
        }
    }
    if (v) return -1;
}

int main(){
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    cin>>n>>m;
    for (int i=1; i<=n; ++i) {
        cin>>a[i]; update(i,a[i]);
    }
    while (m--) {
        int c,x,y; cin>>c>>x;
        if (c==2) {
            cout<<get(x)<<'\n';
        } else {
            cin>>y;
            if (!c) {
                update(x,y);
                a[x]+=y;
            } else { int sm=0;
                for( int i=x; i<=y; ++i) sm+=a[i];
                cout<<query(y)-query(x-1)<<'\n';
            }
        }
    }

    return 0;
}