Pagini recente » Cod sursa (job #2744471) | Cod sursa (job #582706) | Cod sursa (job #2321581) | Cod sursa (job #662872) | Cod sursa (job #1342422)
#include <fstream>
#define DIM 100011
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,qw;
int v[DIM],A[2*DIM+1];
void update(int p,int x){
for(;p<=n;p+=p&(-p)) A[p]+=x;
}
int query1(int p){
int r=0;
for(;p>0;p-=p&(-p)) r+=A[p];
return r;
}
int query2(int a){
int p=1,d=qw,r=0;
for(;d>0;d/=2){
if(p+d-1<=n && A[p+d-1]<=a){
a-=A[p+d-1];
if(!a) return p+d-1;
p+=d;
}
}
return -1;
}
int main(void){
register int i,j,t,a,b;
f>>n>>m;
for(qw=1;qw<=n;qw*=2);
for(i=1;i<=n;i++) f>>v[i],update(i,v[i]);
for(i=1;i<=m;i++){
f>>t;
switch(t){
case 0:
f>>a>>b;
update(a,b);
break;
case 1:
f>>a>>b;
g<<query1(b)-query1(a-1)<<"\n";
break;
default:
f>>a;
g<<query2(a)<<"\n";
}
}
f.close();
g.close();
return 0;
}