Cod sursa(job #2394474)

Utilizator VNohaiNohai Vlad-Auras VNohai Data 1 aprilie 2019 17:33:19
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

#define NMAX 100001

int n, m, sum,val, poz;
int v[4*NMAX+66];
int q[NMAX];

void update(int nod, int l, int r)
{
    if(l==r)
    {
    v[nod]=v[nod]+val;
    return;
    }
    int mij=(l+r)/2;
    if(poz<=mij)
    update(nod*2, l, mij);
    else
    update(nod*2+1, mij+1, r);
    v[nod]=v[nod*2] + v[nod*2+1];
}

void query(int nod, int l, int r, int x, int y)
{
     if(x<=l && y>=r)
     {
     sum=sum+v[nod];
     return;
     }
     int mij=(l+r)/2;
     if(x<=mij) query(nod*2, l, mij, x, y);
     if(y>mij)  query(nod*2+1, mij+1, r, x, y);
}

void verif()
{
    for(int i=1; i<=n*2+1; i++)
    cout<<v[i]<<" ";
    cout<<'\n';
}

int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
    fin>>val;
    poz=i;
    update(1, 1, n);
    q[i]=q[i-1]+val;
    }
    for(int i=1; i<=m; i++)
    {
    int c, a, b;
    fin>>c;
    if(c==0)
    {
    fin>>a>>b;
    poz=a;
    val=b;
    update(1, 1, n);
    verif();
    for(int i=a; i<=n; i++)
    q[i]=q[i]+b;
    }
    else
    if(c==1)
    {
    fin>>a>>b;
    sum=0;
    query(1, 1, n, a, b);
    fout<<sum<<'\n';
    }
    else
    {
    fin>>a;
    for(int i=1; i<=n; i++)
    if(q[i]==a) fout<<i<<'\n';
    }
    }
    return 0;
}