Pagini recente » Cod sursa (job #2299458) | Cod sursa (job #2464153) | Monitorul de evaluare | Cod sursa (job #86910) | Cod sursa (job #3311083)
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <set>
#include <bitset>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
const ll MOD=1000000007;
const string filename="aib";
ifstream fin(filename+".in");
ofstream fout(filename+".out");
void update(vector<ll> &aib,ll val,ll pos){
ll x=aib.size();
while(pos<x){
aib[pos]+=val;
pos+=(pos&(-pos));
}
}
ll prefsum(vector<ll> &aib,ll pos){
ll sum=0;
while(0<pos){
sum+=aib[pos];
pos-=(pos&(-pos));
}
return sum;
}
ll srq(vector<ll> &aib,ll a,ll b){
return prefsum(aib,b)-prefsum(aib,a-1);
}
int main()
{
ll n,m,x,y,z;
fin>>n>>m;
vector<ll> v(n+1),aib(n+1,0);
for(ll i=1;i<=n;i++){
fin>>v[i];
update(aib,v[i],i);
}
for(ll i=0;i<m;i++){
fin>>x;
if(x==0){
fin>>y>>z;
update(aib,z,y);
}
if(x==1){
fin>>y>>z;
fout<<srq(aib,y,z)<<'\n';
}
if(x==2){
fin>>y;
ll i=1,sum=0;
bool ok=true;
while(ok && i<=n){
while(sum+aib[i+(i&(-i))]<=y && i+(i&(-i))<=n){
i+=(i&(-i));
}
sum+=aib[i];
if(sum==y){
ok=false;
}
if(sum>y){
ok=false;
}
i++;
}
if(sum==y){
fout<<i-1<<'\n';
}
else fout<<-1<<'\n';
}
}
return 0;
}