Pagini recente » Cod sursa (job #1917318) | Cod sursa (job #2320720) | Cod sursa (job #3228467) | Cod sursa (job #2940412) | Cod sursa (job #1819353)
#include <fstream>
#include <vector>
using namespace std;
int n,m;
vector<int> aib;
void add(int p, int v){
while(p<=n){
aib[p]+=v;
p += p&-p;
}
}
int sum(int p){
if(p==0||p>n) return 0;
int s=0;
while(p){
s+=aib[p];
p -= p&-p;
}
return s;
}
int finds(int s){
int mask=1<<30;
while(mask>n) mask>>=1;
int poz=0;
for(;mask;mask>>=1){
if((poz|mask)<=n && aib[poz|mask]<=s){
poz|=mask;
s-=aib[poz];
}
}
if(s==0 &&poz) return poz;
else return -1;
}
int main()
{
ifstream fin("aib.in");
ofstream fout("aib.out");
fin>>n>>m;
aib.resize(n+1,0);
for(int i=1;i<=n;++i){
int x; fin>>x;
add(i,x);
}
for(int i=0;i<m;++i){
int c,a,b; fin>>c>>a;
if(c==0){
fin>>b;
add(a,b);
}
else if(c==1){
fin>>b;
fout<<sum(b)-sum(a-1)<<'\n';
}
else{
fout<<finds(a)<<'\n';
}
}
return 0;
}