Cod sursa(job #2511600)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 19 decembrie 2019 13:46:05
Problema Arbori indexati binar Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>

using namespace std;
long long int n,m,aint[100009],a,b,in2,sf2;
ifstream f("aib.in");
ofstream g("aib.out");
///-------------------------------------------
void update(int in, int sf, int nod, int val, int poz)
{
    if(in==sf)
    {
        aint[nod]+=val;
        return;
    }
    int mij=(in+sf)/2;
    if(poz<=mij)
    {
        update(in, mij, 2*nod, val, poz);
    }
    else update(mij+1, sf, 2*nod+1, val, poz);
    aint[nod]=aint[2*nod]+aint[2*nod+1];
}
///-------------------------------------------
int cauta1(int in, int sf, int in2, int sf2, int nod)
{
    if(in==in2 && sf==sf2)
        return aint[nod];
    int mij=(in+sf)/2;
    if(mij<in2)
    {
        return cauta1(mij+1,sf,in2, sf2, 2*nod+1);
    }
    if(mij>=sf2)
    {
        return cauta1(in,mij,in2,sf2,2*nod);
    }
    if(mij>=in2 && mij<sf2)
    {
        return cauta1(mij+1,sf,mij+1, sf2, 2*nod+1)+cauta1(in,mij,in2,mij,2*nod);
    }

}
///-------------------------------------------
int cauta2(int in, int sf, int nod, int a)
{
    if(in==sf && a==aint[nod]) return in;
    else if(in==sf) return -1;
    int mij=(in+sf)/2;
    if(aint[2*nod]>=a) return cauta2(in, mij, nod*2, a);
    else return cauta2(mij+1, sf, nod*2+1, a-aint[nod*2]);
}
///-------------------------------------------
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int x;
        f>>x;
        ///in,sf,nod,val,poz
        update(1,n,1,x,i);
    }
    for(int i=1;i<=m;i++)
    {
        int c;
        f>>c;
        if(c==0)
        {
            f>>a>>b;
            update(1,n,1,b,a);
        }
        if(c==1)
        {
            f>>in2>>sf2;
            g<<cauta1(1,n,in2,sf2,1)<<"\n";
        }
        if(c==2)
        {
            f>>a;
            ///in,sf,nod,totatl
            g<<cauta2(1,n,1,a)<<"\n";
        }
    }
    return 0;
}