Cod sursa(job #3145042)

Utilizator sireanu_vladSireanu Vlad sireanu_vlad Data 12 august 2023 12:22:47
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.91 kb
#include<iostream>
using namespace std;

const int NMAX=1e5;
int v[NMAX],n,m,aib[NMAX];

void update(int pos, int val){
	while(pos<=n){
		aib[pos]+=val;
		pos+=(pos&-pos);
	}
}

int parSum(int pos){
	int sum=0;
	while(pos>0){
		sum+=aib[pos];
		pos-=(pos&-pos);
	}
	return sum;
}

int cautbin(int k){
	int index=0;
	for(int bit=16;bit>=0;bit--){
		index+=1<<bit;
		if(index>n||parSum(index)>k){
			index-=1<<bit;
		}
	}
	if(parSum(index)==k){
		return index;
	}
	return -1;
}

int main(){
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>v[i];
		update(i, v[i]);
	}
	while(m--){
		int t;
		cin>>t;
		if(t==0){
			int pos,val;
			cin>>pos>>val;
			update(pos,val);
		}else if(t==1){
			int l,r;
			cin>>l>>r;
			cout<<parSum(r)-parSum(l-1)<<'\n';
		}else{
			int k;
			cin>>k;
			cout<<cautbin(k)<<'\n';
		}
	}
}