Cod sursa(job #3209475)

Utilizator _Fibonacci_Caitaz _Fibonacci_ Data 2 martie 2024 15:40:29
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;
const int MAXN=100000+1;
int n,t[4*MAXN],arr[MAXN],i,cod,x,y,k;


void build(int a[], int v, int tl, int tr) {
    if (tl == tr) {
        t[v] = a[tl];
    } else {
        int tm = (tl + tr) / 2;
        build(a, v*2, tl, tm);
        build(a, v*2+1, tm+1, tr);
        t[v] = t[v*2]+t[v*2+1];
    }
}

int sum(int v, int tl, int tr, int l, int r) {
    if (l > r) 
        return 0;
    if (l == tl && r == tr) {
        return t[v];
    }
    int tm = (tl + tr) / 2;
    return sum(v*2, tl, tm, l, min(r, tm))+sum(v*2+1, tm+1, tr, max(l, tm+1), r);
}

void update(int v, int tl, int tr, int pos, int new_val) {
    if (tl == tr) {
        t[v] = new_val;
    } else {
        int tm = (tl + tr) / 2;
        if (pos <= tm)
            update(v*2, tl, tm, pos, new_val);
        else
            update(v*2+1, tm+1, tr, pos, new_val);
        t[v] = t[v*2]+t[v*2+1];
    }
}

int main()
{
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	cin >> n >> k ;
	for (i=0;i<n;i++)cin>>arr[i];
	build(arr,1,0,n-1);
	for (i=1;i<=k;i++)
	{
		cin >> cod >> x >>y ;
		if (cod==1)
		{
			cout << sum(1,0,n-1,x-1,y-1)<<"\n";
		}
		else 
		{
			update(1,0,n-1,x-1,arr[x-1]-y);
			arr[x-1]=arr[x-1]-y;
		}
	}
    return 0;
}