Cod sursa(job #1232969)

Utilizator RaileanuCristian Raileanu Raileanu Data 24 septembrie 2014 13:24:10
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>

using namespace std;
ifstream f1("aib.in");
ofstream f2("aib.out");
#define MX 100005

int n,m,i, a,b,o, ai[2*MX+10],k ;

void update(int nod, int st, int dr)
{
    if (st==dr ) {ai[nod]+=b; return; }

    int m=(st+dr)/2;
    if (a<=m) update(nod*2,st,m);
    else update(nod*2+1,m+1,dr);
    ai[nod]=ai[nod*2]+ai[nod*2+1];
}

int query(int nod, int st, int dr)
{
    if (a<=st && dr<=b ) return ai[nod];

    int m=(st+dr)/2, sm=0;
    if (a<=m )  sm+=query(nod*2,st,m);
    if (b>m ) sm+=query(nod*2+1,m+1,dr);
    return sm;
}

int query2(int nod, int st, int dr, int sm)
{
    if (st>=dr && sm-ai[nod]!=0 ) return -1; else
        if (sm-ai[nod]==0 && st<=dr) return dr;

    int m=(st+dr)/2;

    if (sm-ai[nod*2]<=0 ) return query2(nod*2,st,m,sm);
           else return query2(nod*2+1,m+1,dr,sm-ai[nod*2] );
}

int main()
{
    f1>>n>>m;
    for (a=1; a<=n; a++)
    {   f1>>b;
        update(1,1,n); }

    for (i=1; i<=m; i++)
    {   f1>>o>>a;
            if (o!=2)
                f1>>b;
        if (!o) update(1,1,n);
            else if (o==1) f2<<query(1,1,n)<<"\n";
                else f2<<query2(1,1,n,a)<<"\n"; }

    f2.close();
    return 0;
}