Cod sursa(job #2632379)

Utilizator AlexMariMarinescu Alexandru AlexMari Data 3 iulie 2020 09:34:24
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");

int n,m;

struct Aint
{
    int v[400005];

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

    int query(int node,int left,int right ,int st,int dr)
    {
        if(dr<left||st>right)
            return 0;
        if(left>=st&&right<=dr)
            return v[node];
        int mijl=(left+right)/2;
        if(right<=mijl)
            return query(2*node,left,mijl,st,dr);
        else
            if(left>=mijl+1)
            return query(2*node+1,mijl+1,right,st,dr);
        else
        return query(2*node,left,mijl,st,dr)+query(2*node+1,mijl+1,right,st,dr);
    }
}aint;

int main()
{
    int i,op,x,y;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        aint.update(1,i,1,n,x);
    }
    for(i=1;i<=m;i++)
    {
        fin>>op>>x>>y;
        if(op==1)
        {
            fout<<aint.query(1,1,n,x,y);
            fout<<'\n';
        }
        else
            aint.update(1,x,1,n,-y);
    }
    return 0;
}