Cod sursa(job #3340219)

Utilizator Cos2509Patruta Costin Cos2509 Data 12 februarie 2026 19:41:45
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <bits/stdc++.h>
#define dim 100001 

using namespace std ;

long long g[dim] , tree[4 * dim] , n ; 
 
int q ;  
int op ;
void build(int v , int tl , int tr){
	  
	  if(tl == tr) tree[v] = g[tl] ;  
	  else{
	  	  
	  	  int tm = (tl + tr) / 2 ; 
	  	  build(2 * v , tl , tm) ; 
	  	  build(2 * v + 1 , tm + 1 , tr) ; 
	  	  
	  	  tree[v] = tree[2 * v] + tree[2 * v + 1] ;  
	  	  
	  }
}
void update(int v , int tl , int tr , int poz , int val){
	  
	  if(tl == tr) tree[v] += val ; 
	  else{
	  	 
	  	 int tm = (tl + tr) / 2 ; 
	  	 if(poz <= tm) update(2 * v , tl ,tm , poz , val) ; 
	  	 else update(2 * v + 1 , tm + 1 , tr , poz , val) ; 
	  	 
	  	 tree[v] = tree[2 * v] + tree[2 * v + 1] ;  
	  }
} 
long long query(int v , int tl , int tr , int st , int dr){
	  
	  if(tl > dr || tr < st) return 0 ; 
	  
	  if(tl >= st && tr <= dr) return tree[v] ; 
	  
	  int tm = (tl + tr) / 2 ;  
	  
	  return query(2 * v , tl , tm , st , dr) + query(2 * v + 1 , tm + 1 , tr , st , dr) ; 
} 

long long binary(int v , int tl , int tr , long long a){
	  
	if(tl == tr){
		 
		 if(tree[v] == a) return tl ;
		 
		 return -1 ;   
	}
	
	int tm = (tl + tr) / 2 ;
	
	if(tree[2 * v] >= a) return binary(2 * v , tl , tm , a) ; 
	else return binary(2 * v + 1 , tm + 1 , tr , a - tree[2 * v]) ;  
	
} 

int main()
{
   ios::sync_with_stdio(false);
   cin.tie(0) ;
   
   cin >> n >> q ;  
   for(int i = 1 ; i <= n ; ++i) cin >> g[i] ; 
   
   build(1 , 1 , n) ;  
   
   while(q--){
   	   
   	   cin >> op ; 
	   if(op == 0){
	   	   
	   	   int poz , val ; 
	   	   cin >> poz >> val ; 
	   	   
	   	   update(1 , 1 , n , poz , val) ; 
	   }  
	   else if(op == 1){
	   	   
	   	   int a , b ;
	   	   cin >> a >> b ;
	   	   
	   	   cout << query(1 , 1 , n , a , b) << '\n' ;  
	   }
	   else{
	   	 
	   	 ///op = 2 : 
	   	  
	   	 long long a ;
	   	 cin >> a ;  
	   	 if(tree[1] < a) cout << -1 << '\n' ; 
	   	 else cout << binary(1 , 1 , n , a) << '\n' ;  
	   } 
	   
   }
   return 0 ;
}