Mai intai trebuie sa te autentifici.
Cod sursa(job #647675)
Utilizator | Data | 11 decembrie 2011 19:11:19 | |
---|---|---|---|
Problema | Arbori indexati binar | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 0.98 kb |
#include<fstream>
#define NMAX 100100
using namespace std;
int n,aib[NMAX];
int search(int val) {
int step,i;
for(step=1;step<n;step<<=1);
for(i=0;step;step>>=1)
if(i+step<=n)
if(val>=aib[i+step]) {
i+=step;
val-=aib[i];
if(!val)
return i;
}
return -1;
}
int query(int nod) {
int mask=1,sol=0;
while(nod>0) {
sol+=aib[nod];
while(!(nod&mask)) mask<<=1;
nod-=mask;
mask<<=1;
}
return sol;
}
void update(int nod,int val) {
int mask=1;
while(nod<=n) {
aib[nod]+=val;
while(!(nod&mask)) mask<<=1;
nod+=mask;
mask<<=1;
}
}
int main() {
int i,tip,x,y,m;
ifstream in("aib.in");
ofstream out("aib.out");
in>>n>>m;
for(i=1;i<=n;i++) {
in>>x;
update(i,x);
}
while(m--) {
in>>tip>>x;
if(tip!=2)
in>>y;
switch(tip) {
case 0:update(x,y);break;
case 1:out<<query(y)-query(x-1)<<'\n';break;
case 2:out<<search(x)<<'\n';break;
}
}
in.close();
out.close();
return 0;
}