Cod sursa(job #2042214)
Utilizator | Data | 18 octombrie 2017 10:41:53 | |
---|---|---|---|
Problema | Arbori indexati binar | Scor | 60 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.2 kb |
#include <fstream>
#define DIM 100001
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
int n,m,i,j,st,dr,mid,c,x,y,v[DIM],a[DIM];
int query (int p){
int r = 0;
for (;p;p-=(p&-p) )
r += a[p];
return r;
}
int update (int p,int x){
for (;p<=n;p+=(p&-p))
a[p] += x;
}
int main (){
fin>>n>>m;
for(i=1;i<=n;i++){
fin>>v[i];
update (i,v[i]);
}
for (i=1;i<=m;i++){
fin>>c;
if (c == 0){
fin>>x>>y;
update (x,y);
}
else{
if (c == 1){
fin>>x>>y;
fout<<query (y) - query (x-1)<<"\n";
}
else{
fin>>x;
st = 1;
dr = n;
while (st<=dr){
mid = (st + dr)/2;
if (query(mid) < x)
st = mid+1;
else
dr = mid-1;
}
if (query(st) == x)
fout<<st<<"\n";
else
fout<<-1<<"\n";
}
}
}
return 0;
}