Cod sursa(job #1889127)

Utilizator cyber_ghSoltan Gheorghe cyber_gh Data 22 februarie 2017 16:31:53
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N,M,A[100010],aib[200010];

int parent(int x){
	return x-(x&(~x)+1);
}
int next(int x){
	return x+(x&(~x)+1);
}

bool inrange(int x){
	return  x<=N;
}

void update(int index,int val){
	if (inrange(index)){
		aib[index]+=val;
		update(next(index),val);
	}
	else return;
	
}

int getsum(int x){
	if (x){
		return aib[x]+getsum(parent(x));
	}
	else return 0;
}

int cobor(int index,int k){
	for (int i=1;i<=index;i++) if (aib[i]==k) return i;
	return -1;
}

void caz1(){
	
	int x,y;
	fin >>x>>y;
	update(x,y);
	
}
void caz2(){
	int x,y;
	fin >>x>>y;
	fout <<getsum(y)-getsum(x-1)<<"\n";
	
}
void caz3(){
	int x;
	fin >>x;
	fout <<cobor(N,x)<<"\n";
	
}

int main(){

	fin >>N>>M;
	for (int i=0;i<N;i++){
		fin >>A[i];
		update(i+1,A[i]);
	}
	//for (int i=1;i<=N;i++) cout <<i<<" "<<aib[i]<<endl;
	
	while (M--){
		short x;
		fin>>x;
		switch(x){
			case 0:caz1();break;
			case 1:caz2();break;
			case 2:caz3();break;
			
		}	
		
	}
	return 0;
}