Cod sursa(job #630318)

Utilizator the_snyper06FMI - ALexandru Mihai the_snyper06 Data 5 noiembrie 2011 11:31:45
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<cstdio>

using namespace std;
int n, m;
int v[100001], sum[100001];

inline void add(const int &a, const int &b) {
	int i;
	
	v[a] += b;
	for(i = a; i <= n; i++) sum[i] += b;
}

inline int CautareBinara(const int &st, const int &dr, const int &x)
{
	int m = (st + dr) / 2;
	if(st > dr) return -1;
	if(sum[m] == x) return m;
	if(sum[m] < x) return CautareBinara(m + 1, dr, x);
	if(sum[m] > x) return CautareBinara(st, m - 1, x);
	
	return -1;
}

int main() {
	int i, x, a, b;
	
	freopen("aib.in", "r", stdin), freopen("aib.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for(i = 1; i <= n; i++)	{
		scanf("%d", v + i);
		sum[i] = sum[i - 1] + v[i];
	}
	
	for(i = 1; i <= m; i++) {
		scanf("%d", &x);
		switch(x) {
			case 0:
				scanf("%d %d", &a, &b);
				add(a, b);
			break;
			
			case 1:
				scanf("%d %d", &a, &b);
				printf("%d\n", sum[b] - sum[a - 1]);
			break;
			
			case 2:
				scanf("%d", &a);
				printf("%d\n", CautareBinara(1, n, a));
			break;
		}
	}
	
	return 0;
}