Cod sursa(job #1635597)

Utilizator NacuCristianCristian Nacu NacuCristian Data 6 martie 2016 19:11:53
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <stdio.h>

using namespace std;

int arb[200010];
int n,m,a,b;

int constructie(int st,int dr,int k)
{
    if(st==dr)
    {
        scanf("%d",&arb[k]);
        return arb[k];
    }
    int mij=(st+dr)/2;
    return arb[k]=constructie(st,mij,2*k)+constructie(mij+1,dr,2*k+1);
}

void update(int st, int dr, int k)
{
    if(st==dr && st==a)
    {
        arb[k]+=b;
        return;
    }
    int mij=(st+dr)/2;
    if(a>mij)
    {
        update(mij+1,dr,2*k+1);
        arb[k]+=b;
        return;
    }

    update(st,mij,2*k);
    arb[k]+=b;
    return;
}

int srch(int st, int dr, int k)
{
    if(st>=a && dr<=b)
        return arb[k];

    int mij=(st+dr)/2;
    int sum=0;
    if(mij>=a)
    sum+=srch(st,mij,2*k);
    if(mij+1<=b)
    sum+=srch(mij+1,dr,2*k+1);
    return sum;
}
int ok=1;


void sum(int st, int dr, int k)
{
    if(arb[k]==a)
        {
            printf("%d\n",dr);
            ok=0;
            return;
        }
    int mij=(st+dr)/2;
    sum(st,mij,2*k);

}

void citire()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d",&n,&m);
    constructie(1,n,1);
    for(int i=0;i<m;i++)
    {
        int x;
        scanf("%d",&x);
        if(x==0)
        {
            scanf("%d %d",&a,&b);
            update(1,n,1);
        }
        else if(x==1)
        {
            scanf("%d %d",&a,&b);
            printf("%d\n",srch(1,n,1));
        }
        else if(x==2)
        {
            scanf("%d",&a);
            ok=1;
            sum(1,n,1);
        }
    }

}


int main()
{
    citire();
    return 0;
}