Cod sursa(job #2855592)

Utilizator AndreeaRheaAndreea Gheorghe AndreeaRhea Data 22 februarie 2022 17:24:45
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>
#define dim 100001

using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

int n, m;
int tree[4*dim+66];

void Update(int nod, int left, int right, int pos, int val)
{
    if(left==right)
    {
        tree[nod]=val;
        return ;
    }
    int mid=(left+right)/2;
    if(pos<=mid)
        Update(2*nod, left, mid, pos, val);
    else
        Update(2*nod+1, mid+1, right, pos, val);
    tree[nod]=tree[2*nod]+tree[2*nod+1];
}

int Query(int nod, int left, int right, int start, int finish)
{
    if(start<=left && right<=finish)
        return tree[nod];
    int mid=(left+right)/2, rs=0, rd=0;
    if(start<=mid)
        rs=Query(2*nod, left, mid, start, finish);
    if(mid<finish)
        rd=Query(2*nod+1, mid+1, right, start, finish);
    return rs+rd;
}

int main()
{
    fin>>n>>m;
    for (int i=1; i<=n; i++)
    {
        int x;
        fin>>x;
        Update(1, 1, n, i, x);
    }
    for (int i=1; i<=m; i++)
    {
        int x, a, b;
        fin>>x>>a>>b;
        if(x==1)
            fout<<Query(1, 1, n, a, b)<<'\n';
        else
            Update(1, 1, n, a, max(Query(1, 1, n, a, a)-b, 0));
    }
    return 0;
}