Pagini recente » Cod sursa (job #495386) | Cod sursa (job #2636951) | Cod sursa (job #1673103) | Cod sursa (job #2696825) | Cod sursa (job #727465)
Cod sursa(job #727465)
//Include
#include <fstream>
using namespace std;
//Definitii
#define leftSon node<<1
#define rightSon (node<<1)+1
//Constante
const int MAX_SIZE = (int)1e5+1;
//Functii
void update(int, int, int);
void query(int, int, int);
//Variabile
ifstream in("aib.in");
ofstream out("aib.out");
int n, q;
int question;
int poz, val, sum;
int sumaCautata;
int intervalLeft, intervalRight;
int tree[MAX_SIZE<<2];
//Main
int main()
{
in >> n >> q;
for(poz=1 ; poz<=n ; ++poz)
{
in >> val;
update(1, 1, n);
}
for(int i=1 ; i<=q ; ++i)
{
in >> question;
switch(question)
{
case 0:
{
in >> poz >> val;
update(1, 1, n);
break;
}
case 1:
{
in >> intervalLeft >> intervalRight;
sum = 0;
query(1, 1, n);
out << sum << '\n';
break;
}
default:
{
intervalLeft = 1;
in >> sumaCautata;
for(intervalRight=1 ; intervalRight<=n ; ++intervalRight)
{
sum = 0;
query(1, 1, n);
if(sum == sumaCautata)
{
out << intervalRight << '\n';
break;
}
}
if(intervalRight > n)
out << "-1\n";
}
}
}
in.close();
out.close();
return 0;
}
void update(int node, int left, int right)
{
if(left == right)
{
tree[node] += val;
return ;
}
int mid = (left + right) >> 1;
if(poz <= mid)
update(leftSon, left, mid);
else
update(rightSon, mid+1, right);
tree[node] = tree[leftSon] + tree[rightSon];
}
void query(int node, int left, int right)
{
if(intervalLeft <= left && right <= intervalRight)
{
sum += tree[node];
return;
}
int mid = (left + right) >> 1;
if(intervalLeft <= mid)
query(leftSon, left, mid);
if(mid < intervalRight)
query(rightSon, mid+1, right);
}