Cod sursa(job #2776075)

Utilizator Alex_DiaconuDiaconu Alexandru Alex_Diaconu Data 18 septembrie 2021 16:05:57
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream cin ("datorii.in");
ofstream cout ("datorii.out");

const int N=100001;
int n, m, xs[N], v[4*N];

void build(int ind, int st, int dr)
{
	if (st == dr)
    {
		v[ind]=xs[st];
		return;
	}

	int mid = (st + dr) / 2;
	build(2 * ind, st, mid);
	build(2 * ind + 1, mid + 1, dr);
	v[ind] = v[ind*2] + v[ind*2+1];
}

int query(int ind, int st, int dr, int l, int r)
{
	if (st>=l && dr<=r)
    {
		return v[ind];
	}
	if (dr<l || st>r)
	{
		return 0;
	}
	int mid=(st+dr)/2, left=query(2*ind,st,mid,l,r), right=query(2*ind+1,mid+1,dr,l,r);
	return left+right;
}

void update(int ind, int st, int dr, int val, int pos)
{
	if (st==dr)
    {
		v[ind]-=val;
		return;
	}
	int mid=(st+dr)/2;
	if (pos<=mid)
	{
		update(2*ind,st,mid,val,pos);
	}
	else
	{
		update(2*ind+1,mid+1,dr,val,pos);
	}
	v[ind]=v[2*ind]+v[2*ind+1];
}
int main()
{

	cin >> n >> m;
	for (int i=1; i<=n; i++)
    {
		cin >> xs[i];
	}
	build(1,1,n);
	int x, a, b;
	for (int i=0; i<m; i++)
    {
		cin >> x >> a >> b;
		if (x==1)
		{
			cout << query(1,1,n,a,b) << '\n';
		}
		else
		{
			update(1,1,n,b,a);
		}
	}
	return 0;
}