Pagini recente » Cod sursa (job #345337) | Cod sursa (job #2455526) | Cod sursa (job #1616342) | Cod sursa (job #364771) | Cod sursa (job #1149493)
#include <fstream>
#define maxn 300005
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
long long int putere(int x){
return x&(-x);
}
int x,arb[maxn],x1,x2,op,n,m,s1,s2,poz;
long long int a;
void update(long long int poz,long long int val){
while(poz<=n){
arb[poz]+=val;
poz+=putere(poz);
}
}
int suma( int pozitie){
int s=0;
while(pozitie>0){
s+=arb[pozitie];
pozitie-=putere(pozitie);
}
return s;
}
int find (long long int a){
int lim=1,poz=0;
while(lim<n)
lim<<=1;
while(a && lim){
if(lim+poz<=n){
if(a>=arb[lim+poz]){
a-=arb[lim+poz];
poz+=lim;
if(a==0)
return poz;
}
}
lim>>=1;
}
return -1;
}
int main()
{
f>>n>>m;
for(int i=1;i<=n;++i){
f>>x;
poz=i;
update(poz,x);
}
for(int i=1;i<=m;++i){
f>>op;
if(op==0){
f>>x1>>x2;
update(x1,x2);
}
else
if(op==1){
f>>x1>>x2;
s1=suma(x2);
s2=suma(x1-1);
g<<s1-s2<<"\n";
}
else{
f>>a;
g<<find(a);
g<<"\n";
}
}
return 0;
}