Cod sursa(job #3291328)

Utilizator sSemiMeauca Emanuel sSemi Data 4 aprilie 2025 10:29:36
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");

int n,q,a[15000],tree[4*15000],task;

void constr(int node, int left, int right)
{
    if(left==right)
        tree[node]=a[left];
    else
    {
        int mid=(left+right)/2;
        constr(2*node,left,mid);
        constr(2*node+1,mid+1,right);

        tree[node]=tree[2*node]+tree[2*node+1];
    }
}

void update(int node,int left, int right,int newval,int newpoz)
{
    if(left==right)
        tree[node]-=newval;
    else
    {
        int mid=(left+right)/2;
        if(newpoz<=mid)
            update(node*2,left,mid,newval,newpoz);
        else
            update(node*2+1,mid+1,right,newval,newpoz);

        tree[node]=tree[node*2]+tree[node*2+1];
    }
}

int querry(int node, int left, int right, int qleft,int qright)
{
    if(qleft<=left && right <=qright)
        return tree[node];
    else
    {
        int mid=(left+right)/2;
        if(mid+1<=qleft)
            return querry(node*2+1,mid+1,right,qleft,qright);
        if(qright<=mid)
            return querry(node*2,left,mid,qleft,qright);

        return ( querry(node*2,left,mid,qleft,qright)+querry(node*2+1,mid+1,right,qleft,qright));

    }
}

int main()
{
    fin >> n >>q;
    for(int i=1;i<=n;i++)
        fin >> a[i];

    constr(1,1,n);

    while(q--)
    {
        fin >> task;
        if(task==0)
        {
            int t,v;
            fin >> t>>v;
            update(1,1,n,v,t);
            a[t]-=v;
        }
        else if(task==1)
        {
            int p,q;
            long long s=0;
            fin >> p>>q;
            fout << querry(1,1,n,p,q) << '\n';
        }
    }
}