Pagini recente » Cod sursa (job #1315483) | Cod sursa (job #2577085) | Cod sursa (job #191192) | Cod sursa (job #542499) | Cod sursa (job #2444770)
// C++
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <deque>
#include <ctime>
#include <map>
#include <chrono>
#include <cmath>
#define INF 0x3f3f3f3f
#define MAX(a,b) a>b ? a:b
#define MIN(a,b) a<b ? a:b
#define lsb(i) i&(-i)
using namespace std;
const int N = 100000;
int n;
int aib[5 + N];
void Update(int nod,int val)
{
for(int i=nod; i<=n; i+=lsb(i))
aib[i] += val;
}
int GetSum(int nod)
{
int s = 0;
for(int i=nod; i>=1; i-=lsb(i))
s += aib[i];
return s;
}
void cb(int x, int &rez)
{
int r, pas, cursum = 0;
r = 0;
pas = 1<<20;
while(pas){
if(r + pas <= n && cursum + aib[r+pas] <= x){
r += pas;
cursum += aib[r];
}
pas >>= 1;
}
if(cursum == x) rez = r;
else rez = -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int q, i, nr, rez;
scanf("%d%d", &n, &q);
for(i=1; i<=n; i++)
{
scanf("%d", &nr);
Update(i,nr);
}
for(i=1; i<=q; i++){
int c, a, b;
scanf("%d%d", &c, &a);
if(c == 0){
scanf("%d", &b);
Update(a,b);
}
else if(c == 1){
scanf("%d", &b);
int suma, sumb;
sumb = GetSum(b);
suma = GetSum(a-1);
printf("%d\n",sumb-suma);
}
else{
cb(a, rez);
printf("%d\n",rez);
}
}
return 0;
}