void update(int start, int end, int add)
{
	update(start, end, 0, 0, n - 1, add);
}
	
void update(int s, int e, int node, int lo, int hi, int add)
{
	if (st[node].mark)propagate(node, hi - lo + 1);
	if (lo > e || hi < s)return;
	if (s <= lo && e >= hi)
	{
		st[node].val += add;
		if (lo != hi)
		{
			st[2 * node + 1].mark += add;
			st[2 * node + 2].mark += add;
		}
		return;
	}
	int mid = lo + (hi - lo) / 2;
	update(s, e, 2 * node + 1, lo, mid, add);
	update(s, e, 2 * node + 2, mid + 1, hi, add);
	st[node].val = st[2 * node + 1].val + st[2 * node + 2].val;
}
 
void propagate(int node, int len)
{
	st[node].val += len * st[node].mark;
	if (len != 1)
	{
		st[2 * node + 1].mark += st[node].mark;
		st[2 * node + 2].mark += st[node].mark;
	}
	st[node].mark = 0;
}

int sumQuery(int qlo, int qhi, int clo, int chi, int i)
{
	if(st[i].mark)propagate(i, chi - clo + 1);
	if (qlo > chi || qhi < clo)return 0;
	if (qlo <= clo && qhi >= chi)return st[i].val;
	int mid = clo + (chi - clo) / 2;
	int res = sumQuery(qlo, qhi, clo, mid, 2 * i + 1) + sumQuery(qlo, qhi, mid + 1, chi, 2 * i + 2);
}