Cod sursa(job #2859214)

Utilizator toda.emanuelatoda emanuela toda.emanuela Data 28 februarie 2022 23:51:16
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int n,m,a,b,x,y,arb[100001],v[15005],indice[15005];
void build(int st,int dr,int poz)
{
    if(st==dr)
    {
        arb[poz]=v[st];
        indice[st]=poz;
        return;
    }
    int mij=(st+dr)/2;
    build(st,mij,2*poz);
    build(mij+1,dr,2*poz+1);
    arb[poz]=arb[2*poz]+arb[2*poz+1];
}

void update(int poz)
{
    if(poz)
    {
        arb[poz]=arb[poz*2]+arb[poz*2+1];
        update(poz/2);
    }
}

int datorie(int st,int dr, int poz)
{
    int mij=(st+dr)/2;
    if(x<=st&&dr<=y) return arb[poz];
    int ans1=0,ans2=0;
    if(x<=mij)
        ans1=datorie(st,mij,2*poz);
    if(y>mij)
        ans2=datorie(mij+1,dr,2*poz+1);
    return ans1+ans2;
}
int main()
{
    int i,cerinta;
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>v[i];
    build(1,n,1);
    for(i=1;i<=m;i++)
    {
        f>>cerinta>>x>>y;
        if(cerinta==0)
        {
            arb[indice[x]]-=y;
            update(indice[x]/2);
        }
        else
        {
            g<<datorie(1,n,1)<<'\n';
        }
    }

    return 0;
}