Pagini recente » Monitorul de evaluare | Cod sursa (job #2587869) | Statistici BARTA IULIA-BRIGITA (IULIABRIGITA) | Cod sursa (job #2743223) | Cod sursa (job #2392170)
#include <cstdio>
#define pas(x) x&(-x)
using namespace std;
int a[100001];
int s[100001];
int n, m;
int x;
int tip, aa, bb;
void add(int poz, int ce){
for(int i=poz; i<=n; i+=pas(i))
a[i]+=ce;
}
int calculez_pe_interval(int deunde){
int s=0;
for(int i=deunde; i>0; i-=pas(i))
s+=a[i];
return s;
}
int put;
int cautpoz(int k){
int i;
int lg=put;
for(i=1;lg;lg>>=1)
if(i+lg<=n && calculez_pe_interval(i+lg)<=k)
i+=lg;
if(calculez_pe_interval(i+lg) !=k)
return -1;
return i;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &n, &m);
for(put=1; put<=n;put<<=1);
for(int i=1; i<=n; i++){
scanf("%d", &x);
add(i,x);
}
for(int i=1; i<=n; i++)
s[i]=s[i-1]+a[i];
for(int j=1; j<=m; j++){
scanf("%d %d", &tip, &aa);
if(tip<2)
scanf("%d", &bb);
if(tip==0){
add(aa,bb);
}
else if(tip==1)
printf("%d\n",calculez_pe_interval(bb)-calculez_pe_interval(aa-1));
else if(tip==2)
printf("%d\n",cautpoz(aa));
// else if(tip==2
}
return 0;
}