Cod sursa(job #2285193)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 18 noiembrie 2018 11:47:48
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include<stdio.h>

#include<iostream>
#include<fstream>

using namespace std;

#define MAXN 100000

int N,M;
int BT[MAXN+1];

int getSum(int index){ 
    int sum = 0; 
    while(index>0) { 
        sum += BT[index]; 
        index -= index & (-index); 
    } 
    return sum; 
} 
  
void updateBT(int index, int val) { 
    while (index <= N) { 
		BT[index] += val; 
		index += index & (-index); 
    } 
} 

int suma;
int findmink(int left,int right){
	int l=1,r=N;
	int mid,s;
	while(left <= right){
		mid=(left+right)/2;
		s=getSum(mid);
		if(s==suma)
			return mid;
		if(suma<s){
			right=mid-1;
		}
		else{
			left=mid+1;
		}
	}
	return -1;
}
 
int main(){
	
	freopen("aib.in", "r", stdin);
	//freopen("arbint_test5.in", "r", stdin);
	freopen("aib.out", "w", stdout);

	scanf("%d %d", &N,&M);

	int v;
	for(int i=0;i<N;i++){
		scanf("%d", &v);
		updateBT(i+1,v); 
	}

	int a,b,tip,sum,rez;
	for(int i=0;i<M;i++){
		scanf("%d",&tip);
		switch(tip){
			case 0:
				// adunare valoare
				scanf("%d %d",&a,&b);
				updateBT(a,b); 
				break;
			case 1:
				// interogare suma
				scanf("%d %d",&a,&b);
				sum=getSum(b)-getSum(a-1); 
				printf("%d\n",sum);
				break;
			case 2:
				// minimum k
				scanf("%d",&suma);
				rez=findmink(1,N);
				printf("%d\n",rez);
				break;
		}
	}

	return 0;
}