Cod sursa(job #3177459)

Utilizator RusuRRusu Rares RusuR Data 29 noiembrie 2023 10:51:29
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include <bits/stdc++.h>

std::ifstream f("aib.in");
std::ofstream g("aib.out");
const int size=100001;
int n, q;
int a[size+1],v[size+1];

inline int lsb(int x){
	return x & -x;
}

void build(){
	for(int i=1;i<=n;i++){
		a[i]+=v[i];
		if(i+lsb(i)<=n){
			a[i+lsb(i)]+=a[i];
		}
	}
}

void update(int p, int v){
	while(p<=n){
		a[p]+=v;
		p+=lsb(p);
	}
}

int query(int p){
	int r=0;
	while(p){
		r+=a[p];
		p-=lsb(p);
	}
	return r;
}

int search(int val){
	int pos=0;
	int step=1<<20;
	int sum=0;
	while(step){
		if(pos+step<=n && sum+a[pos+step]<=val){
			pos+=step;
			sum+=a[pos];
		}
		step>>=1;
	}
	return pos;
}

int main(){
	f>>n>>q;
	for(int i=1;i<=n;i++)
		f>>v[i];
	build();
	while(q--){
		int t, a, b;
		f>>t>>a;
		switch(t){
			case 0:
				f>>b;
				update(a,b);
				break;
			case 1:
				f>>b;
				g<<query(b)-query(a-1)<<'\n';
				break;
			case 2:
				g<<search(a)<<'\n';
				break;
		}
	}
	return 0;
}