Cod sursa(job #40862)

Utilizator gigi_becaliGigi Becali gigi_becali Data 27 martie 2007 20:01:05
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <cstdio>
#define maxn 1<<15
int S[maxn];
int n, m;

void update(int n, int l, int r, int p, int val, int sgn)
{
	S[n]+=val*sgn;
	if(l>=r) return ;
	int m=(l+r)>>1;
	if(p<=m) update(n<<1, l, m, p,val, sgn);
	else     update((n<<1)|1, m+1, r, p,val,sgn);
}

int query(int n, int l, int r, int a, int b)
{
	if(a<=l && b>=r) return S[n];
	int m=(l+r)>>1, t=0;
	if(a<=m) t+=query((n<<1), l, m, a, b);
	if(b>m)  t+=query((n<<1)|1, m+1, r, a, b);
	return t;
}

int main()
{
	freopen("datorii.in","r", stdin);
	freopen("datorii.out", "w", stdout);
	scanf("%d %d\n", &n, &m);
	int i, t;
	for(i=1;i<=n;i++) { scanf("%d ", &t); update(1, 1, n, i, t, 1);}
int p, q;
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d\n", &t,&p, &q );
		if(t==0) update(1, 1, n, p, q, -1);
		else printf("%d\n", query(1, 1, n, p, q));
	}
	return 0;
}