Cod sursa(job #639832)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 23 noiembrie 2011 23:49:59
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#define zeros(x) x&(-x)

using namespace std;

ifstream in("aib.in");
ofstream out("aib.out");

int st,N,M,AIB[100002];

void adauga(int p,int val)
{
    for(;p<=N;p+=zeros(p))
        AIB[p]+=val;
}

inline int query(int p)
{
    int S=0;
    for(;p;p-=zeros(p))
        S+=AIB[p];
    return S;
}

inline int BS(int key)
{
    int i,step=st;
    if(key==0)return -1;
    for(i=0;step;step>>=1)
    {
        if(i+step<=N&&key>=AIB[i+step])
            key-=AIB[i+step],i+=step;
        if(key==0)//am gasit o solutie
            return i;
    }
    return -1;
}

int main()
{
    int a,b,c,q,i;
    in>>N>>M;
    for(i=1;i<=N;i++)
        in>>c,adauga(i,c);
    for(st=1;st<N;st<<=1);//pentru cautarea binara
    while(M--)
    {
        in>>q;
        if(q==0)//lui a ii adaug valoarea c
        {
            in>>a>>c;
            adauga(a,c);
        }
        if(q==1)//suma valorilor din intervalul [a,b];
        {
            in>>a>>b;
            out<<query(b)-query(a-1)<<'\n';
        }
        if(q==2)//determin pozitia minima k astfel incat suma valorilor primilor k termeni sa fie exact a
        {
            in>>a;
            out<<BS(a)<<'\n';
        }
    }
    return 0;
}