Cod sursa(job #386462)

Utilizator freak93Adrian Budau freak93 Data 24 ianuarie 2010 20:54:29
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<fstream>

using namespace std;

const char iname[]="aib.in";
const char oname[]="aib.out";
const int maxn=100005;

ifstream f(iname);
ofstream g(oname);

int i,j,n,m,x,y,z,aib[maxn];

void update(int x,int y)
{
    for(;x<=n;x+=x&-x)
        aib[x]+=y;
}

int query(int x,int y)
{
    int s=0;
    for(;y;y-=y&-y)
        s+=aib[y];
    --x;
    for(;x;x-=x&-x)
        s-=aib[x];
    return s;
}

int search(int s)
{
    int step;
    for(step=1;step<n;step<<=1);
    int i;
    for(i=0;step;step>>=1)
        if(i+step<=n&&aib[i+step]<=s)
            i+=step,s-=aib[i];
    if(s)
        return -1;
    return i>0?i:-1;
}

int main()
{
    f>>n>>m;
    for(i=1;i<=n;++i)
        f>>x,update(i,x);
    for(i=1;i<=m;++i)
    {
        f>>x;
        if(x==0)
            f>>y>>z,update(y,z);
        if(x==1)
            f>>y>>z,g<<query(y,z)<<"\n";
        if(x==2)
            f>>y,g<<search(y)<<"\n";
    }

    f.close();
    g.close();

    return 0;
}