Cod sursa(job #3259307)

Utilizator Bolfa_DBolfa Diana Bolfa_D Data 25 noiembrie 2024 19:09:59
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
#define NMAX 100500
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int tree[NMAX], n;
void update(int poz,int val)
{
    for(int i=poz;i<=n;i+=i&(-i))
        tree[i]+=val;
}
int query(int poz)
{
    int s=0;
    for(int i=poz;i>0;i-=i&(-i))
        s+=tree[i];
    return s;
}
int bin(int val)
{
    int st=0;
    while(val>0 && tree[st+1]<=val)
    {
        st++;
        while(st+(st&(-st))<=n && tree[st+(st&(-st))]<=val)
            st+=(st&(-st));
        val-=tree[st];
    }

    if(val!=0 || st>n)
        return -1;
    return st;
}

int m, v[NMAX], a, b,c;
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;++i)
    {
        fin>>v[i];
        update(i,v[i]);
    }

for(int i=1;i<=n;++i)
    cout<<tree[i]<< " ";cout<<'\n';

    for(int i=1;i<=m;++i)
    {
        fin>>c;
        if(c==0)
        {
            fin>>a>>b;
            update(a,b);
        }
        if(c==1)
        {
            fin>>a>>b;
            fout<<query(b)-query(a-1)<<'\n';
        }
        if(c==2)
        {
            fin>>a;
            fout<<bin(a)<<'\n';
        }
    }

    return 0;
}