Cod sursa(job #1673928)

Utilizator superstar1998Moldoveanu Vlad superstar1998 Data 4 aprilie 2016 11:18:54
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#define MAXN 100001
#define INFILE "aib.in"
#define OUTFILE "aib.out"
using namespace std;
#define zeros(x) (x&-x)
ifstream f(INFILE);
ofstream g(OUTFILE);
int n,m,aib[100001],x,y,i,k;
void upd(int x, int val)
{
    for(int i=x;i<=n;i+=zeros(i))
        aib[i]+=val;
}
int query(int x)
{
    int res=0;
    for(int i=x;i;i-=zeros(i))
        res+=aib[i];
    return res;
}
int cauta(int x)
{
    int step;
    for(step=1;step<=n;step<<=1);
    for(i=0;step;step>>=1)
        if(i+step<=n)
            if(x>=aib[i+step])
            {
                x-=aib[i+step];
                i+=step;
                if(!x)return i;
            }
    return -1;
}
int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>x;
        upd(i,x);
    }
    for(;m--;)
    {
        f>>k;
        if(k==0)
        {
            f>>x>>y;
            upd(x,y);
        }
        else if(k==1)
        {
            f>>x>>y;
            g<<query(y)-query(x-1)<<'\n';
        }
        else
        {
            f>>x;
            g<<cauta(x)<<'\n';
        }
    }
    f.close();
    g.close();
    return 0;
}