Cod sursa(job #530712)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 8 februarie 2011 11:54:01
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
# include <fstream>
  using namespace std;
    inline int zero (int a){
		return a&-a;
	}
	int aib[200000], cit, n, m, intrebare, r1, r2;
	void adauga (int val, int poz){
		for (int i = poz; i <= n; i += zero (i))
			aib[i] += val;
	}
	inline int suma (int poz){
		int s = 0;
		for (int i = poz; i > 0; i -= zero (i))
			s += aib[i];
		return s;
	}
	int cb (int in, int sf, int find){
		int ret = -1;
		while (in <= sf){
			int m = (in + sf) >> 1;
			int abc = suma (m);
			if (abc >= find){
				if (abc == find)
				    ret = m;
				sf = m - 1;
			}
			else
				in = m + 1;
		}
		return ret;
	}
	std :: ifstream f ("aib.in");
	std :: ofstream g ("aib.out");
	int main (){
		f >> n >> m;
		for (int i = 1; i <= n; ++i){
			f >> cit;
		    adauga (cit, i);
			//aib[i] = aib[i - 1] + cit;
		}
		for (; m > 0; --m){
			f >> intrebare;
			if (intrebare == 0){
				f >> r1 >> r2;
				adauga (r2, r1);
				continue ;
			}
			if (intrebare == 1){
				f >> r1 >> r2;
				g << suma (r2) - suma (r1 - 1) << '\n';
				continue ;
			}
			//aici faci la cautare binara
			f >> r1;
			g << cb (1, n, r1) << '\n';
		}
		g.close ();
		return 0;
	}