Cod sursa(job #1264044)

Utilizator dan.seremetDan Seremet dan.seremet Data 15 noiembrie 2014 14:43:38
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<cstdio>
using namespace std;
const int nmax=1e5+1;
int aib[nmax];
int n, m;

void update(int pos, int val)
{for(; pos<=n; pos+=(pos&(pos-1))^pos)
    aib[pos]+=val;
}

int querry(int pos)
{int s=0;
 for(; pos; pos-=(pos&(pos-1))^pos)
    s+=aib[pos];
 return s;
}

int search(int a, int b, int val)
{int med, q, last=-1;
 while(a<=b)
    {med=(a+b)>>1;
     q=querry(med);
     if(q>=val)
        {last=med;
         b=med-1;
        }
     else a=med+1;
    }
 return last;
}

int main()
{freopen("aib.in", "r", stdin);
 freopen("aib.out", "w", stdout);
 scanf("%d%d", &n, &m);
 int i, op, a, b;
 for(i=1; i<=n; i++)
    {scanf("%d", &a);
     update(i, a);
    }
 for(i=1; i<=m; i++)
    {scanf("%d", &op);
     if(!op)
        {scanf("%d%d", &a, &b);
         update(a, b);
        }
     else if(op==1)
        {scanf("%d%d", &a, &b);
         printf("%d\n", querry(b)-querry(a-1));
        }
     else if(op==2)
        {scanf("%d", &a);
         b=search(1, n, a);
         if(querry(b)!=a) b=-1;
         printf("%d\n", b);
        }
    }
 return 0;
}