Cod sursa(job #2536471)

Utilizator leru007Leru Ursu leru007 Data 2 februarie 2020 08:56:34
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define int long long
using namespace std;
ll i,j,mod=1e9+7;
ll n,m;
ll tree[200005];
ll sum(ll k){
    ll s=0;
    while(k>=1){
        s+=tree[k];
        k-=k&-k;
    }
    return s;
}
void add(ll k,ll x){
    while(k<=n){
        tree[k]+=x;
        k+=k&-k;
    }
}
ll bin1(ll l,ll r,ll x){
    if(r<l||r>n) return -1;
    ll mid=l+(r-l)/2;
    if((sum(mid)==x&&mid==1)||(sum(mid)==x&&sum(mid-1)!=x)) return mid;
    else if(sum(mid)<x) bin1(mid+1,r,x);
    else bin1(l,mid-1,x);
}
int32_t main() {
    ifstream cin("aib.in");
ofstream cout("aib.in");
    cin>>n;
    cin>>m;
    for(i=1;i<=n;i++){
        ll x;
        cin>>x;
        add(i,x);
    }
    for(i=1;i<=m;i++){
        ll tip;
        cin>>tip;
        if(tip==0){
            ll a,b;
            cin>>a>>b;
            add(a,b);
        }
        else if(tip==1){
            ll a,b;

            cin>>a>>b;
            if(a==1) cout<<sum(b)<<"\n";
            else cout<<sum(b)-sum(a-1)<<"\n";
        }
        else{
            ll a;
            cin>>a;
            cout<<bin1(1,n,a)<<"\n";
        }
    }
    //for(i=1;i<=n;i++) cout<<tree[i]<<" ";
}