Cod sursa(job #1236821)

Utilizator ZimmyZimmermann Erich Zimmy Data 2 octombrie 2014 17:36:08
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#define N 100010
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int v[N],a,b,c,L,R,M,query(int),n,m;
void upd(int,int);
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>a;
        upd(i,a);
    }
    for(;m;m--)
    {
        fin>>c;
        if(c==0)
        {
            fin>>a>>b;
            upd(a,b);
            continue;
        }
        if(c==1)
        {
            fin>>a>>b;
            fout<<query(b)-query(a-1)<<'\n';
            continue;
        }
        fin>>a;
        if(a>query(n))
        {
            fout<<"-1\n";
            continue;
        }
        for(L=0,R=n;R-L>1;)
        {
            M=(L+R)/2;
            if(query(M)<a)
                L=M;
            else
                R=M;
        }
        if(query(R)==a)
            fout<<R<<"\n";
        else
            fout<<"-1\n";

    }
    return 0;
}
int query(int i)
{
    int ret=0;
    for(;i;i-=i& (-i))
        ret+=v[i];
    return ret;
}
void upd(int i,int val)
{
    for(;i<=n;i+=i&(-i))
        v[i]+=val;

}