Cod sursa(job #1345481)

Utilizator horiainfoTurcuman Horia horiainfo Data 17 februarie 2015 17:31:59
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <fstream>
#include <cstdio>
#define NMAX 100001
using namespace std;
ofstream fout("aib.out");
struct arbore{int inc,sf,val;} arb[NMAX*3];
int n,m;
long long s,a;
void adaug(int val,int poz)
{
    int tata=1,inc=1,sf=n;
    while(inc!=sf)
    {
        arb[tata].val+=val;
        if(poz<=(inc+sf)/2) tata=tata*2,sf=(inc+sf)/2;
        else tata=tata*2+1,inc=(inc+sf)/2+1;
    }
    arb[tata].val+=val;
}
int suma(int nod,int inc,int sf)
{
    int mij=(arb[nod].inc+arb[nod].sf)/2;
    if(inc==arb[nod].inc && sf==arb[nod].sf) return arb[nod].val;

    if(inc<=mij)
        if(sf>mij)
            return suma(nod*2,inc,mij)+suma(nod*2+1,mij+1,sf);
        else
            return suma(nod*2,inc,sf);
    else
        return suma(nod*2+1,inc,sf);
}
void numerotez(int nod,int inc,int sf)
{
    arb[nod].inc=inc; arb[nod].sf=sf;
    if(inc==sf) return;

    numerotez(nod*2,inc,(inc+sf)/2);
    numerotez(nod*2+1,(inc+sf)/2+1,sf);
}
int pozitie(int nod)
{
    if(s+arb[nod].val==a) {s=s+arb[nod].val; return arb[nod].sf;}

    if(s+arb[nod].val>a)
    {
        int k=pozitie(nod*2);
        if(s==a) return k;
        if(s<a)
        {
            k=pozitie(nod*2+1);
            if(s==a) return k;
        }
    }
    else
    {
        s=s+arb[nod].val;
        return -1;
    }
    return -1;
}
int main()
{
    freopen("aib.in","r",stdin);
    scanf("%d%d",&n,&m);
    numerotez(1,1,n);
    int x;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        adaug(x,i);
    }
    int task,b;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&task,&a);
        if(task==0) {scanf("%d",&b); adaug(b,a);}
        else
            if(task==1)
                {scanf("%d",&b); fout<<suma(1,a,b)<<'\n';}
            else
            {
                s=0;
                fout<<pozitie(1)<<'\n';
            }
    }
    return 0;
}