Cod sursa(job #1675757)

Utilizator teoceltareconstantin teodor teoceltare Data 5 aprilie 2016 15:45:57
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.24 kb
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,v[100001],a,b,x,max1;
struct nod
{
    int in,fin,suma;
    nod *st,*dr,*tata;
} *tot,*c;
void suma1()
{
    if(tot->in<tot->fin)
    {
        int mij=(tot->in+tot->fin)/2;
        c=new(nod);
        c->tata=tot;
        tot->st=c;
        c->in=tot->in;
        c->fin=mij;
        tot=c;
        suma1();
        tot=tot->tata;
        c=new(nod);
        c->tata=tot;
        tot->dr=c;
        c->in=mij+1;
        c->fin=tot->fin;
        tot=c;
        suma1();
        tot=tot->tata;
        tot->suma=tot->dr->suma+tot->st->suma;
    }
    else
    {
        tot->suma=v[tot->in];
        tot->st=0;
        tot->dr=0;
    }
}
void citire()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>v[i];
    }
    tot=new(nod);
    tot->in=1;
    tot->fin=n;
    tot->suma=0;
    tot->tata=0;
    suma1();
}
void adaugare()
{
    if(tot->in<tot->fin)
    {
        int mij=(tot->in+tot->fin)/2;
        tot->suma+=b;
        if(a<=mij)
        {
            tot=tot->st;
            adaugare();
        }
        else
        {
            tot=tot->dr;
            adaugare();
        }
    }
    else
    {
        tot->suma+=b;
        while(tot->tata!=0)
        {
            tot=tot->tata;
        }
    }
}
void val(int prim, int ult)
{
    int mid=(tot->in + tot->fin)/2;
    if(tot->in<prim)
    {
        if(prim<=mid)
        {
            if(ult>mid)
            {
                tot=tot->st;
                val(prim, mid);
                tot=tot->tata;
                tot=tot->dr;
                val(mid+1,ult);
                tot=tot->tata;
            }
            else
            {
                tot=tot->st;
                val(prim,ult);
                tot=tot->tata;
            }
        }
        if(prim>mid)
        {
            tot=tot->dr;
            val(prim,ult);
            tot=tot->tata;
        }
    }
    else if(tot->in==prim and tot->fin==ult)
    {
        max1+=tot->suma;
    }
    else
    {
        if(ult<=mid)
        {
            tot=tot->st;
            val(prim,ult);
            tot=tot->tata;
        }
        else
        {
            tot=tot->st;
            val(prim,mid);
            tot=tot->tata;
            tot=tot->dr;
            val(mid+1,ult);
            tot=tot->st;
        }
    }
}
void progr()
{
    pula:;
    while(tot->suma>a)
    {
        tot=tot->st;
    }
    if(tot->suma==a)
    {
        fout<<tot->fin<<'\n';
    }
    else
    {
        a-=tot->suma;
        tot=tot->tata;
        tot=tot->dr;
        goto pula;
    }
}
int main()
{
        citire();
    for(int j=1;j<=m;j++)
    {
        fin>>x;
        if(x==0)
        {
            fin>>a>>b;
            v[a]+=b;
            adaugare();
        }
        if(x==1)
        {
            max1=0;
            fin>>a>>b;
            val(a,b);
            fout<<max1<<'\n';
        }
        if(x==2)
        {
            fin>>a;
            progr();
            while(tot->tata)
            {
                tot=tot->tata;
            }
        }
    }
}