Cod sursa(job #1336761)

Utilizator bogdanpaunFMI Paun Bogdan Gabriel bogdanpaun Data 8 februarie 2015 06:00:33
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>

using namespace std;

int n , m , a , b ,c;
#define N 100100
int v[N] , s[N] ;

void update(int poz,int val){
    for( ; poz <= n ; poz+= poz&-poz ) s[poz]+=val;
}
int query(int poz){
    int sol = 0;
    for( ; poz ; poz -= poz&-poz ) sol += s[poz];
    return sol;
}

int pos(int x){
    int sol=0,poz=1;
    for(;poz<=n;poz<<=1); poz>>=1;
    for( ; poz ; poz>>=1 )
        if( sol + poz <= n && s[sol+poz] <= x ){
            x -= s[sol+poz];
            sol += poz;
        }
    return sol;
}

int main()
{
    freopen("aib.in" , "r" , stdin);
    freopen("aib.out", "w" , stdout);
    scanf("%d %d\n",&n,&m);
    for(register int i = 1; i <= n; ++i){
        scanf("%d ",&v[i]);
        update( i , v[i] );
    }
    for(register int i = 1; i <= m; ++i){
        scanf("%d",&c);
        if( c == 2 ){
            scanf("%d",&a);
            printf("%d\n",pos(a));
        }else{
            scanf("%d %d",&a,&b);
            if( c == 0 ) update(a,b);
            else printf("%d\n", (query(b) - query(a-1) ));
        }
    }
    return 0;
}