Cod sursa(job #3175852)

Utilizator antonio_sefu_tauLaslau Antonio antonio_sefu_tau Data 26 noiembrie 2023 14:31:22
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
using namespace std;
const int dim=1e5+5;
int n,m,aib[dim];
int lsb(int x){
    return (x&(-x));
}
void update(int poz, int val){
    for(int i=poz;i<=n;i+=lsb(i)){
        aib[i]+=val;
    }
}
int sum(int x){
    int s=0;
    for(int i=x;i>=1;i-=lsb(i)){
        s+=aib[i];
    }
    return s;
}
int main(){
    ifstream f("aib.in");
    ofstream g("aib.out");
    ios_base::sync_with_stdio(false);
    f.tie(nullptr);
    g.tie(nullptr);
    f>>n>>m;
    for(int i=1;i<=n;i++){
        int x;
        f>>x;
        update(i,x);
    }
    while(m--){
        int t;
        f>>t;
        if(t==0){
            int x,y;
            f>>x>>y;
            update(x,y);
        }
        if(t==1){
            int x,y;
            f>>x>>y;
            g<<sum(y)-sum(x-1)<<'\n';
        }
        if(t==2){
            int x;
            f>>x;
            int st=1,dr=n,sol=-1;
            while(st<=dr){
                int mid=(st+dr)/2;
                int s=sum(mid);
                if(s<x){
                    st=mid+1;
                }
                else
                if(s>x){
                    dr=mid-1;
                }
                else{
                    sol=mid;
                    dr=mid-1;
                }
            }
            g<<sol<<'\n';
        }
    }
    return 0;
}