Cod sursa(job #1889148)

Utilizator cyber_ghSoltan Gheorghe cyber_gh Data 22 februarie 2017 16:40:49
Problema Arbori indexati binar Scor 30
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,aib[100010];

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;
	for (int i=1;i<=N;i++) if (getsum(i)==x) {
		fout <<i<<"\n";
		return ;
	}
	fout <<"-1\n";
}

int main(){

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