Cod sursa(job #3177034)

Utilizator RusuRRusu Rares RusuR Data 28 noiembrie 2023 12:32:01
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 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, pas, s=0;
  pas=1<<20;
	while(pas){	
		if(pos+pas<=n && s+a[pos+pas]<val){
			pos+=pas;
      s+=a[pos];
    }
    pas>>=1;
  }
  pos++;
  if(pos<=n && (query(pos)==val)) return pos;
  return -1;
}

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