Cod sursa(job #1943636)

Utilizator KOzarmOvidiu Badea KOzarm Data 28 martie 2017 18:42:33
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>

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


struct elem
{
    int st,dr,val;
}a[100003];

int n,m,x,p,y,z;



void preconstruire(int st,int dr,int poz)
{
    a[poz].st=st;
    a[poz].dr=dr;
    a[poz].val=0;
    if(st!=dr)
    {
        preconstruire(st,(st+dr)/2,2*poz);
        preconstruire((st+dr)/2+1,dr,2*poz+1);
    }
}

void adauga(int &i,int &x,int poz)
{
    a[poz].val+=x;
    if(a[poz].st!=a[poz].dr)
    {
        if(a[2*poz].st<=i&&a[2*poz].dr>=i)
            adauga(i,x,2*poz);
        else
            adauga(i,x,2*poz+1);
    }
}

int suma(int &st, int &dr,int poz)
{
    if(a[poz].st>=st&&a[poz].dr<=dr)
        return a[poz].val;
    else
    {
        int sum=0;
        if(a[2*poz].dr>=st&&a[2*poz].st<=dr)
            sum+=suma(st,dr,2*poz);
        if(a[2*poz+1].dr>=st&&a[2*poz+1].st<=dr)
            sum+=suma(st,dr,2*poz+1);
        return sum;
    }
}


int pozitie(int poz,int &val)
{
    if(a[poz].val==val)
    {
        val=0;
        return a[poz].dr;
    }
    if(a[poz].st==a[poz].dr)
        return -1;
    if(a[2*poz].val<val)
    {
        val=val-a[2*poz].val;
        return pozitie(2*poz+1,val);
    }
    else
        return pozitie(2*poz,val);
}


int main()
{
    fin>>n>>m;
    preconstruire(1,n,1);
    for(int i=1;i<=n;i++)
    {
        fin>>x;
        adauga(i,x,1);
    }
    for(int i=1;i<=m;i++)
    {
        fin>>p;
        if(p==0)
        {
            fin>>x>>y;
            adauga(x,y,1);
        }
        else
        if(p==1)
        {
            fin>>x>>z;
            y=suma(x,z,1);
            fout<<y<<"\n";
        }
        else
        {
            fin>>x;
            y=pozitie(1,x);
            fout<<y<<"\n";
        }
    }
    return 0;
}