Cod sursa(job #1889177)

Utilizator cyber_ghSoltan Gheorghe cyber_gh Data 22 februarie 2017 16:55:23
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 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;
}

int binarysearch(int st,int dr,int val){
	int mid=(st+dr)/2;
	int sum=getsum(mid);
	if (st==dr){
		if (sum==val) return mid;
		else return -1;
		
	}  
	if (sum<val) binarysearch(mid+1,dr,val);
	else if (sum>val)binarysearch(st,mid-1,val);
	else if (sum==val) return mid;
}

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;
	int index=binarysearch(1,N,x);
	fout <<index<<"\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;
}