Pagini recente » Cod sursa (job #1939952) | Monitorul de evaluare | Cod sursa (job #1730400) | Cod sursa (job #316759) | Cod sursa (job #2652061)
#include <bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX = 100005;
int n;
int v[NMAX], s[NMAX];
int len(int x) {
return (x - (x & (x - 1)));
}
void update(int pz, int val) {
while (pz <= n) {
s[pz] += val;
pz += len(pz);
}
}
int querry (int pz) {
int rz = 0;
while (pz > 0) {
rz += s[pz];
pz -= len(pz);
}
return rz;
}
int main(){
int m,op,a,b,rz;
in>>n>>m;
for(int i=1;i<=n;i++){
in>>v[i];
update(i,v[i]);
}
for(int i=1;i<=m;i++)
{
in>>op;
if(op==0){
in>>a>>b;
update(a,b);
}
if(op==1){
in>>a>>b;
rz=querry(b)-querry(a-1);
out<<rz<<"\n";
}
if(op==2){
in>>a;
int pas=1<<20;
rz=0;
while(pas>0){
if(rz+pas<=n && s[rz+pas]<=a){
rz+=pas;
a-=s[rz];
}
pas/=2;
}
if(a==0 && rz>0)
out<<rz<<"\n";
else
out<<"-1\n";
}
}
return 0;
}