Cod sursa(job #2816877)

Utilizator GargantuanRoOprea Rares GargantuanRo Data 12 decembrie 2021 13:25:29
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>

using namespace std;

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

const int nmax=15001;
int aint[4*nmax];
int v[nmax];

void build(int node,int left,int right)
{
    if(left==right)
    {
        aint[node]=v[left];
        return;
    }
    int mid=(left+right)/2;
    build(2*node,left,mid);
    build(2*node+1,mid+1,right);
    aint[node]=aint[2*node]+aint[2*node+1];
}

void update(int node,int left,int right,int poz,int value)
{
    if(left==right)
    {
        aint[node]=value;
        return;
    }
    int mid=(left+right)/2;
    if(poz<=mid)
        update(2*node,left,mid,poz,value);
    else
        update(2*node+1,mid+1,right,poz,value);
    aint[node]=aint[2*node]+aint[2*node+1];
}

int querry(int node,int left,int right,int qleft,int qright)
{
   if(qleft<=left&&qright>=right)
        return aint[node];
    int mid,ans=0;
    mid=(left+right)/2;
    if(qleft<=mid)
        ans+=querry(2*node,left,mid,qleft,qright);
    if(mid<qright)
        ans+=querry(2*node+1,mid+1,right,qleft,qright);
    return ans;
}

int main()
{
    int n,i,q;
    cin>>n>>q;
    for(i=0;i<n;i++)
        cin>>v[i];
    build(1,0,n-1);
    for(i=1;i<=q;i++)
    {
        int left,right,t;
        cin>>t;
        if(t==0)
        {
            int poz,val;
            cin>>poz>>val;
            poz--;
            v[poz]-=val;
            val=v[poz];
            update(1,0,n-1,poz,val);
        }
        if(t==1)
        {
            cin>>left>>right;
            left--;
            right--;
            if(left>right)
                swap(left,right);
            cout<<querry(1,0,n-1,left,right)<<'\n';
        }

    }
    return 0;
}