Cod sursa(job #615622)

Utilizator NikitaUtiuNichita Utiu NikitaUtiu Data 10 octombrie 2011 12:57:43
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

int n;
int vect_aib[1000000];

void update(int, int);
int query(int);

int sum;
int bSearch(int, int);


inline int val_query(int, int);
inline int max_query(int);


int main(void) {
	int m;
	ifstream fin("aib.in");
	fin >> n >> m;
	
	int val;
	for(int i = 1; i <= n; ++i) {
		fin >> val;
		update(i, val);
	}
	
	int op, x, y;
	ofstream fout("aib.out");
	for(int i = 1; i <= m; ++i) {
		fin >> op >> x;
		if(op == 0) {
			fin >> y;
			update(x, y);
		}
		if(op == 1) {
			fin >> y;
			fout << val_query(x, y) << '\n';
		}
		if(op == 2)
			fout << max_query(x) << '\n';
	}
	fin.close();
	fout.close();
}


inline int val_query(int x, int y) {
	return query(max(x,y)) - query(min(x,y)-1);
}

inline int max_query(int x) {
	sum = x;
	return bSearch(1, n);
}



int query(int x) {
	int sum = 0;
	while(x > 0) {
		sum += vect_aib[x];
		x -= (x & -x);
	}
	return sum;
}

void update(int x, int y) {
	while(x <= n) {
		vect_aib[x] += y;
		x += (x & -x);
	}
}

int bSearch(int x, int y) {
	while(x <= y) {
		int mij = (x + y) / 2;
		int val_mij = query(mij);
		
		if(val_mij == sum)
			return mij;
		if(sum < val_mij)
			y = mij - 1;
		else
			x = mij + 1;
	}
	return -1;
}