Cod sursa(job #2965375)

Utilizator andrei_sebi15Andrei andrei_sebi15 Data 15 ianuarie 2023 00:40:13
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 15000
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
typedef unsigned long long ull;
vector<ull>v(NMAX+1);
vector<ull>tree(4*NMAX+1);
void update_nod(int nod)
{
    tree[nod]=tree[2*nod]+tree[2*nod+1];
}
void build(int nod,int st,int dr)
{
    if(st==dr)
        tree[nod]=v[st];
    else
    {
        int mij=(st+dr)/2;
        build(2*nod,st,mij);
        build(2*nod+1,mij+1,dr);
        update_nod(nod);
    }
}
void update(int nod,int st,int dr,int poz,ull val)
{
    if(st==dr)
        tree[nod]-=val;
    else
    {
        int mij=(st+dr)/2;
        if(poz<=mij)
            update(2*nod,st,mij,poz,val);
        if(mij+1<=poz)
            update(2*nod+1,mij+1,dr,poz,val);
        update_nod(nod);
    }
}
ull query(int nod,int st,int dr,int qst,int qdr)
{
    if(qst<=st && dr<=qdr)
        return tree[nod];
    else
    {
        int mij=(st+dr)/2;
        ull s1,s2;
        s1=s2=0;
        if(qst<=mij)
         s1=query(2*nod,st,mij,qst,qdr);
        if(mij+1<=qdr)
         s2=query(2*nod+1,mij+1,dr,qst,qdr);
        return s1+s2;
    }
}
int main()
{
    int n,m;in>>n>>m;
    for(int i=1;i<=n;i++)
     in>>v[i];
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int t;in>>t;
        if(t)
        {
            int x,y;in>>x>>y;
            out<<query(1,1,n,x,y)<<'\n';
        }
        else
        {
            int x;in>>x;
            ull y;in>>y;
            update(1,1,n,x,y);
        }
    }
    return 0;
}