Cod sursa(job #2203146)

Utilizator shantih1Alex S Hill shantih1 Data 11 mai 2018 10:44:24
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>

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

int p,cat,n,i,j,nr,sum[200000],l1,l2,a,b,x,m,k,o;

void update(int nr,int st,int dr)
{
    if(st==dr)
    {
        sum[nr]+=cat;
        return;
    }
    int md=(st+dr)/2;
    if(p<=md)   update(nr*2,st,md);
    else        update(nr*2+1,md+1,dr);
    sum[nr]=sum[nr*2]+sum[nr*2+1];
}

int queab(int nr,int st,int dr)
{
    if(st>=a&&dr<=b)    return sum[nr];
    int md=st+(dr-st)/2,r=0;
    l1=st;  l2=md;
    if(max(l1,a)<=min(l2,b))    r+=queab(nr*2,l1,l2);
    l1=md+1;l2=dr;
    if(max(l1,a)<=min(l2,b))    r+=queab(nr*2+1,l1,l2);
    return r;
}

int quek(int nr,int st,int dr)
{
    if(st==dr)  return st;
    int md=st+(dr-st)/2,p=0;
    if(sum[nr*2]>=k)    p=quek(nr*2,st,md);
    else
    {
        k-=sum[nr*2];
        p=quek(nr*2+1,md+1,dr);
    }
    return p;
}

int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        p=i;
        fin>>cat;
        update(1,1,n);
    }
    for(i=1;i<=m;i++)
    {
        fin>>o;
        if(o==0)
        {
            fin>>p>>cat;
            update(1,1,n);
        }
        if(o==1)
        {
            fin>>a>>b;
            fout<<queab(1,1,n)<<"\n";
        }
        if(o==2)
        {
            fin>>k;
            fout<<quek(1,1,n)<<"\n";;
        }
    }
}