Cod sursa(job #2883237)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 1 aprilie 2022 12:32:37
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>
#define f(x) x&(-x)

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

const int NMAX = 100005;
int aib[NMAX];
int n,m,a,b,k,nr,operatie;

void update(int poz,int val){
    for(int i=poz;i<=n;i+=f(i))
        aib[i]+=val;
    return;
}

int query(int poz){
    int sum=0;
    for(int i=poz;i>=1;i-=f(i))
        sum+=aib[i];
    return sum;
}

void find_pozmin(int a){
    int st=1,dr=n,mij,rasp=0;
    while(st<=dr){
        mij=(st+dr)/2;
        int suma = query(mij); // "suma primilor k termeni"
        if(suma==a){
            rasp=mij;
            fout << rasp << '\n';
            return;
        }
        if(suma<a){
            st=mij+1;
        } else {
            dr=mij-1;
        }
    }
    fout << "-1" << '\n';
    return;
}

void citire(){
    fin >> n >> m;
    for(int i=1;i<=n;i++){
        fin >> nr;
        update(i,nr);
    }
    for(int i=1;i<=m;i++){
        fin >> operatie;
        if(operatie==0){
            fin >> a >> b;
            update(a,b);
        }
        if(operatie==1){
            fin >> a >> b;
            int sum=query(b)-query(a-1);
            fout << sum << '\n';
        }
        if(operatie==2){
            fin >> a;
            find_pozmin(a);
        }
    }
}

int main()
{
    citire();
    return 0;
}