Cod sursa(job #2639166)

Utilizator Gliumarin negai Gliu Data 31 iulie 2020 17:17:29
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <iostream>
#include <fstream>

using namespace std;
typedef long long ll; 
ifstream in("aib.in");
ofstream out("aib.out");
const int Nmax=100099;
ll n,m,s[Nmax],k,a,b;

ll sum(int x){
	ll result=0;
	int i=x;
	while(i>=0){
	 result+=s[i];
	 i=(i & (i+1))-1;
	}
	return result;
}

void add(int pos,ll diff){
	while(pos <=n){
		s[pos]+=diff;
		pos = pos | (pos+1);
	}
}

ll cautare(ll b){
	int dr=n+1,st=0,mid=(dr+st)/2,o; 
	while(st<dr){
		o=sum(mid);
		if(b>o){
			st=mid;
		}else if(b<o){
			dr=mid;
		}else return mid;
		mid=(dr+st)/2;
	}
	return mid;   
}
 
int main(){
in >>n>>m;
for(int i=1;i<=n;i++){
	in >>k;
	add(i,k);
}

while(m--){
 in >>k;
 if(k<2){
 	if(k){
 		in >>a>>b;
 		out <<sum(b)-sum(a-1)<<"\n";
	 }else{
	 	in >>a>>b;
	 	add(a,b);
	 }
 }else{
 	in>>b;
 	out <<cautare(b)<<"\n";
 }
}
return 0;
}