Cod sursa(job #2639189)

Utilizator Gliumarin negai Gliu Data 31 iulie 2020 20:20:39
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 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 pos=n+1,dr=n+1,st=0,mid,s;
   mid=n;
   s=sum(mid);
   if(s==b) return n;
   
   while(mid){
   	mid=(dr+st)>>1;
   	s=sum(mid);
   	if(s>b){
   		if(dr >mid)dr=mid;
   		mid--;
   	
	   }else if(s == b)pos=min(pos,mid),dr=mid,mid--;
	   else{
	   	if(st<mid)st=mid;
	   	mid++;
	   }
	   
	   if(mid>=dr)break;
	   if(mid<=st)break;
   }
   if(pos == n+1)return -1;
   return pos;

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