Cod sursa(job #2175087)

Utilizator GeorgeCalinPetruta George-Calin GeorgeCalin Data 16 martie 2018 15:10:42
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#define nmax 100002
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");

int v[nmax],n,val,m,vel,poz,x,y;

void update(int poz)
{
    while(poz<=n)
    {
        v[poz]+=val;
        poz+=(poz&-poz);
    }
}

int query(int poz)
{
    int s=0;
    while(poz)
    {
        s+=v[poz];
        poz-=(poz&-poz);
    }
    return s;
}

int cauta(int val)
{
    int p,q;
    for(p=1;p<=n;p<<=1);
    for(q=0;p;p>>=1)
    {
        if(q+p<=n&&val>=v[q+p])
        {
            val-=v[p+q];
            q+=p;
            if(!val)
                return q;
        }
    }
    return -1;
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>val;
        update(i);
    }
    for(int i=1;i<=m;i++)
    {
        fin>>vel;
        if(vel==0)
        {
            fin>>poz>>val;
            update(poz);
        }
        if(vel==1)
            fin>>x>>y,fout<<query(y)-query(x-1)<<"\n";
        if(vel==2)
            fin>>val,fout<<cauta(val)<<"\n";
    }
    return 0;
}