Cod sursa(job #1144941)

Utilizator a96tudorAvram Tudor a96tudor Data 17 martie 2014 19:12:48
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<cstdio>
#define ub(x) (x&(-x))
using namespace std;
int V[100010],A[100010],N,T,k,a,b,S,x,St,Poz;
inline int Qwerry(int x)
{
    int S=0;
    for (int i=x;i>0;i-=ub(i))
        S+=A[i];
    return S;
}
inline void BinSearch(int st,int dr,int S)
{
    if (st>dr) return;
    if (st==dr)
        {
            if (Qwerry(st)==S) Poz=st;
            return;
        }
    int mij=(st+dr)/2;
    int Sum=Qwerry(mij);
    if (Sum==S) Poz=mij;
    if (Sum>=S) BinSearch(st,mij,S);
        else BinSearch(mij+1,dr,S);
}
inline void Update(int x,int p,int d)
{
    for (int i=p;i<=N;i+=ub(i)) {A[i]-=d; A[i]+=x;}
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&N,&T);
    for (int i=1;i<=N;++i)
        scanf("%d",&V[i]), Update(V[i],i,0);
    for (int i=1;i<=T;++i)
    {
        scanf("%d",&k);
        if (k==0)
            {
                scanf("%d%d",&a,&b);
                Update(b,a,0);
            }
        if (k==1)
            {
                scanf("%d%d",&a,&b);
                S=Qwerry(b)-Qwerry(a-1);
                printf("%d\n",S);
            }
        if (k==2)
            {
                scanf("%d",&St);
                Poz=-1;
                BinSearch(1,N,St);
                printf("%d\n",Poz);
            }
    }
    fclose(stdin); fclose(stdout);
    return 0;
}