Cod sursa(job #395053)

Utilizator csizMocanu Calin csiz Data 12 februarie 2010 00:26:37
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.25 kb
//fuck it
#include <stdio.h>
#include <fstream>
using namespace std;

#define in "aib.in"
#define out "aib.out"
#define dim 100001

inline int Minim(int a, int b) {
       if ( a < b ) return a;
       return b;
}

int N, M, T;
int Arb[dim];
int C, S;

void Update(int,int);
int Query(int);
int Search(int);

int main()
{
    memset(Arb,0,sizeof(Arb));
    int K, X, Y;

    freopen(in,"r",stdin);
    freopen(out,"w",stdout);

    scanf("%d%d", &N, &M);
    for ( int i = 1; i <= N; i++ )
    {
        scanf("%d", &T);
        Update(i,T);
    }

    for ( ; M; M-- )
    {
        scanf("%d", &K);

        if ( K < 2 )
        {
             scanf("%d%d", &X, &Y);
             if ( !K ) Update(X,Y);
             else      printf("%d\n", Query(Y)-Query(X-1));
        }
        else
        {
            scanf("%d", &X);

            printf("%d\n", Search(X));
        }
    }
}

int Search(int val)
{
    int i, step;

    for ( step = 1; step < N; step <<= 1 );

    for( i = 0; step; step >>= 1 )
    {
         if( i + step <= N)
         {
            if( val >= Arb[i+step] )
            {
                i += step, val -= Arb[i];
                if ( !val ) return i;
            }
         }
    }

    return -1;
}

void Update(int poz, int val)
{
     C = 0;
     while ( poz <= N )
     {
           Arb[poz] += val;
           while ( !(poz & (1<<C)) ) C++;
           poz += (1<<C);
           C += 1;
     }
}

int Query(int poz)
{
    C = 0, S = 0;
    while ( poz > 0 )
    {
          S += Arb[poz];
          while ( !(poz & (1<<C)) ) C++;
          poz -= (1<<C);
          C += 1;
    }

    return S;
}


//#include <iostream>
//#include <fstream>
//#include <vector>
//
//using namespace std;
//
//vector<long int> suma;
//void adauga(long int i,long int n,long int max){
//    while(i<=max){
//        suma[i]+=n;
//        i+=(i&(-i));
//    }
//}
//long int sum(long int i){
//    long int n=0;
//
//    while(i>0){
//        n+=suma[i];
//        i-=(i&(-i));
//    }
//    return n;
//}
//long int minim(long int a,long int max){
//    long int i=0;
//    long int p=1;
//    while(p<=max)p*=2;
//    p/=2;
//
//    while(i+p<=max and p){
//        long int mid=i+p;
//        if(suma[mid]<=a){
//            i=mid;
//            a-=suma[mid];
//        }
//        p/=2;
//    }
//
//    if(a!=0) return -1;
//    else return i;
//}
//
//int main(){
//    ifstream in("aib.in");
//    ofstream out("aib.out");
//
//
//    long int n,m;
//    in>>n>>m;suma=vector<long int>(n+1,0);
//
//
//    for(long int i=0;i<n;i++){
//        long int temp;
//        in>>temp;
//        adauga(i+1,temp,n);
//    }
//    for(long int i=0;i<m;i++){
//        long int c;
//        in>>c;
//        switch(c){
//            long int a,b;
//            case 0:
//            in>>a>>b;
//            adauga(a,b,n);
//            break;
//            case 1:
//            in>>a>>b;
//            out<<sum(b)-sum(a-1)<<"\n";
//            break;
//            case 2:
//            in>>a;
//            out<<minim(a,n)<<"\n";
//            break;
//        }
//    }
//
//}
//
//
//
//
//
//
//
//
//
//
//
//
//
//