Missing Coin Sum Queries

Back to Range Queries

Implementation

C++

                                #include<bits/stdc++.h>
using namespace std;

#define FASTIO ios_base::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL);
#define endl '\n'

const int N = 200005;

int segtree[2*N][30];
long long cumsum[N][30];

inline void comb(int ret[], int left[], int right[]){
    for(int i=0;i<30;i++) ret[i] = min(left[i],right[i]);
}

void query(int l, int r, int ret[]) {
    for(int i=0;i<30;i++) ret[i] = 2e9;
    for( l+=N,r+=N;l<=r;l/=2,r/=2) {
        if (l % 2 == 1) comb(ret, ret, segtree[l++]);
        if (r % 2 == 0) comb(ret, segtree[r--], ret);
    }
}

void answer() {
    int a,b;
    cin>>a>>b;
    int res[30];
    query(a,b,res);
    long long sum = 0, ans = -1;
    for(int i=0;i<30;i++) {
        if( sum+1<res[i] and sum+1 < (1 << (i + 1))  ){
            cout<<sum+1<<endl;
            return;
        }
        sum+= cumsum[b][i]-cumsum[a-1][i];
    }
    cout<<sum+1<<endl;
}

void solve() {
    int n, q;
    cin >> n >> q;
    memset(segtree, 0x3f, sizeof(segtree));

    for(int i=1;i<=n;i++){
        int x;
        cin >> x;
        int g = log2(x);
        segtree[i+N][g] = x;cumsum[i][g] = x;
    }
    for(int i=1;i<=n;i++) for(int j=0;j<30;j++) cumsum[i][j] += cumsum[i-1][j];

    for(int i=N-1;i;i--) comb(segtree[i], segtree[i*2], segtree[i*2+1]);

    while(q--) {
        answer();
    }
}

int main() {
    FASTIO; 
   
    solve();

    return 0;
}