Cod sursa(job #2209469)

Utilizator problem_destroyer69Daniel Hangan problem_destroyer69 Data 3 iunie 2018 15:56:59
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define F first
#define S second
#define INF 1000000005
#define LINF 1000000000000000005
#define MAXN 50005
#define mp make_pair
#define pi pair<int,int>
#define pl pair<ll,ll>
#define vi vector <pi>
#define int long long
int n,m;
int a[100005],tree[100005],sum[100005];

int suma(int k){
    int s = 0;
    while (k >= 1){
        s += tree[k];
        k -= k&-k;
    }
    return s;
}

void add(int k, int x){
    while (k <= n){
        tree[k] += x;
        k += k&-k;
    }
}

int cautare(int s){
    int ans = 0, pow = 1;
    while (pow < n) pow *= 2;
    for (pow; pow; pow /= 2){
        if (pow + ans <= n){
            if (s >= tree[pow + ans]){
                ans += pow;
                s -= tree[ans];
                if (!s) return ans;
            }
        }
    }
    return -1;
}

signed main(){
    ifstream fin("aib.in");
    ofstream fout("aib.out");
    fin >> n >> m;
    for (int i = 1;i <= n;i++){
        fin >> a[i];
        sum[i]=sum[i-1] + a[i];
        tree[i] = sum[i] - sum[i-(i&-i)];
    }
    for (int i = 1;i <= m;i++){
        int q;
        fin >> q;
        if (q != 2){
            int x,y;
            fin >> x >> y;
            if (!q){
                add(x,y);
            }
            else {
                fout << suma(y) - suma(x-1);
                fout << "\n";
            }
        }
        else {
            int x;
            fin >> x;
            fout << cautare(x);
            fout << "\n";
        }
    }
}