Cod sursa(job #2495653)

Utilizator deiubejanAndrei Bejan deiubejan Data 19 noiembrie 2019 18:36:55
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <bits/stdc++.h>
using namespace std;

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

#define cin fin
#define cout fout
/*
*/

const int NMAX=1e5+10;
int v[NMAX];
int arbore[4*NMAX];
int n, m, a, b, cond;

void init(int left, int right, int nod)
{
    if(left==right)
    {
        arbore[nod]=v[left];
        return;
    }
    int mij=(left+right)/2;
    init(left, mij, nod*2);
    init(mij+1, right, nod*2+1);
    arbore[nod]=arbore[nod*2]+arbore[nod*2+1];
}


int sum(int start, int finish, int left, int right, int nod)
{
    if(start<=left&&right<=finish)
        return arbore[nod];
    int mij=(left+right)/2;
    int s=0;
    if(start<=mij)
        s+=sum(start, finish, left, mij, nod*2);
    if(mij<finish)
        s+=sum(start, finish, mij+1, right, nod*2+1);
    return s;
}


void add(int pos, int val, int left, int right, int nod)
{
    arbore[nod]+=val;
    if(left==right)
        return;
    int mij=(left+right)/2;
    if(pos<=mij)
        add(pos, val, left, mij, nod*2);
    else
        add(pos, val, mij+1, right, nod*2+1);
}


int findsum(int suma, int left, int right)
{
    int mij=(left+right)/2;
    int auxsum=sum(1, mij, 1, n, 1);
    if(auxsum>suma)
        return findsum(suma, left, mij-1);
    if(auxsum<suma)
        return findsum(suma, mij+1, right);
    return mij;
}



int main()
{
    cin>>n>>m;
    for(int i=1; i<=n; i++)
        cin>>v[i];
    init(1, n, 1);
    for(int i=1; i<=m; i++)
    {
        cin>>cond;
        if(cond==0)
        {
            cin>>a>>b;
            add(a, b, 1, n, 1);
        }
        else
        if(cond==1)
        {
            cin>>a>>b;
            cout<<sum(a, b, 1, n, 1)<<"\n";
        }
        else
        if(cond==2)
        {
            cin>>a;
            cout<<findsum(a, 1, n)<<"\n";
        }
    }

    return 0;
}