Cod sursa(job #3177031)

Utilizator RusuRRusu Rares RusuR Data 28 noiembrie 2023 12:25:00
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 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 v){
	int st=1, dr=n;
	while(st<dr){
		int m=(st+dr)/2;
		if(query(m)<v)st=m+1;
			else dr=m;
	}
	return dr;
}

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;
}