Cod sursa(job #3197735)

Utilizator stefanvilcescuStefan Vilcescu stefanvilcescu Data 27 ianuarie 2024 13:00:20
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;
const int MAXN=1e5;

int aib[MAXN+1];
int n;

int query(int x){
    int rez;
    rez=0;
    for(; x>=1; x&=(x-1))
        rez+=aib[x];
    return rez;
}

void update(int x, int y){
    for(; x<=n; x+=x&(-x))
        aib[x]+=y;
}

int main(){
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    int a, i, q, b, tip, st, dr, mij;
    cin>>n>>q;
    for(i=1; i<=n; i++){
        cin>>a;
        update(i, a);
        printf("!");
    }
    for(i=0; i<q; i++){
        cin>>tip>>a;
        if(tip<2){
            cin>>b;
            if(tip==0)
                update(a, b);
            else
                cout<<query(b)-query(a-1)<<"\n";
        }else{
            st=0;
            dr=n;
            while(dr-st>1){
                mij=(st+dr)/2;
                if(query(mij)<a)
                    st=mij;
                else
                    dr=mij;
            }
            if(query(dr)==a)
                cout<<dr<<"\n";
            else
                cout<<"-1\n";
        }
    }
}