Cod sursa(job #1766756)

Utilizator mihai2003LLL LLL mihai2003 Data 28 septembrie 2016 15:47:52
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <cstdio>
using namespace std;
 unsigned int aib[100000+5];
 unsigned int n;
unsigned int query(unsigned int p){
    unsigned int rez=0,pow2;
    while(p!=0){
        rez+=aib[p];
        pow2=(p&(-p));
        p-=pow2;
    }
    return rez;
}
unsigned int searchh(unsigned int val){
    unsigned int i=0,pas=1<<30;
    while(pas!=0){
        if(i+pas<=n && aib[i+pas]<=val){
            i+=pas;
            val-=aib[i];
        }
        pas/=2;
    }
    if(val==0)return i;
    return -1;
}
void update(unsigned int p,unsigned int val){
    unsigned int pow2;
    while(p<=n){
        aib[p]+=val;
        pow2=(p&(-p));
        p+=pow2;
    }
}
int main()
{
    unsigned int k,b,a,r;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%u %u",&n,&k);
    for(unsigned int i=1;i<=n;i++)
        scanf("%u",&b),update(i,b);
    for(unsigned int i=1;i<=k;i++){
        scanf("%u",&r);
        if(r==0 || r==1)
            scanf("%u %u",&a,&b);
        else
            scanf("%u",&a);
      //  prunsigned intf("%u %u\n",a,b);
        if(r==0)
            update(a,b);
        if(r==1)
            printf("%u\n",query(b)-query(a-1));
        if(r==2)
            printf("%u\n",searchh(a));
    }
    return 0;
}