Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #29940) | Rating Dragos Rolland (Her0ninja) | Cod sursa (job #1690143)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define INF numeric_limits<int>::max()
#define int64 long long
#define lsb(x) (-x)&(x)
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
vector<int> bit;
int n;
void update(int pos,int val)
{
for(int i=pos;i<=n;i+=lsb(i))
bit[i]+=val;
}
int sum(int pos)
{
int s=0;
for(int i=pos;i>0;i-=lsb(i))
s+=bit[i];
return s;
}
int bin_search(int val)
{
int left=1,right=n;
while(left<=right)
{
int mid=(left+right)/2;
if(sum(mid)==val)
return mid;
if(sum(mid)>val)
right=mid-1;
else
left=mid+1;
}
return -1;
}
int main()
{
int Q;
in>>n>>Q;
bit=vector<int> (n+1);
for(int i=1;i<=n;i++)
{
int x;
in>>x;
update(i,x);
}
for(;Q;Q--)
{
int t,x,y;
in>>t;
if(t==0)
{
in>>x>>y;
update(x,y);
}
else if(t==1)
{
in>>x>>y;
out<<sum(y)-sum(x-1)<<'\n';
}
else{
in>>x;
out<<bin_search(x)<<'\n';
}
}
return 0;
}