Cod sursa(job #2285181)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 18 noiembrie 2018 11:34:02
Problema Arbori indexati binar Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 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 findmink(int suma){
	int rez;
	for(int i=1;i<=N;i++){
		rez=getSum(i);
		if(rez==suma)
			return i;
		if(rez>suma)
			return -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",&a);
				rez=findmink(a);
				printf("%d\n",rez);
				break;
		}
	}

	return 0;
}