Pagini recente » Cod sursa (job #2283450) | Cod sursa (job #1623759) | Cod sursa (job #1179629) | Cod sursa (job #1279928) | Cod sursa (job #759714)
Cod sursa(job #759714)
#include<fstream>
#define nmax 60006
#define max(a,b) (a > b ? a : b)
#define min(a,b) (a > b ? b : a)
#define nod_st (nod * 2)
#define nod_dr (nod * 2 + 1)
#define ll long long
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
long long N, start, finish, v[nmax], poz, val, S, maxi;
ll F[nmax];//suma max a primelor elemente din interval
ll L[nmax];//suma max a ultimelor elemente din interval
ll sum[nmax];//suma toatala
ll M[nmax];//suma maxima oriunde in interval
void update(int nod, int st, int dr)
{
if(st == dr)//se ajunge in nod elementar
{
sum[nod] = v[st];
return;
}
int mij = (st + dr)/2;
update(nod_st, st, mij);
update(nod_dr, mij + 1, dr);
sum[nod] = sum[nod_st] + sum[nod_dr];
}
void change(int nod, int st, int dr)
{
if(st == dr)
{
sum[nod] = val;
return;
}
int mij = (st + dr) / 2;
if(mij >= poz)
change(nod_st, st, mij);
else
change(nod_dr, mij + 1, dr);
sum[nod] = sum[nod_st] + sum[nod_dr];
}
void query(int nod, int st, int dr)
{
if(start <= st && dr <= finish)//intervalele sunt disjuncte si sunt parcurse de la st la dreapta
{
S += sum[nod];
return ;
}
int mij = (st +dr)/2;
if(start <= mij) query(nod_st, st, mij);
if(finish > mij) query(nod_dr, mij + 1, dr);
}
void read()
{
int nr;
fin>> N >>nr;
for(int i = 1; i <= N;i++)
fin >>v[i];
update(1, 1, N);
// for(int i = 1; i <= N;i++)
// fout << sum[i] <<" ";
for(int i = 1; i <= nr; i++)
{
int tip;
fin >>tip;
if( tip == 0)
{
fin >> poz>> val;
val = v[poz] - val;
change(1,1,N);
}
if(tip == 1)
{
fin>>start >> finish;
S = 0;
query(1, 1, N);
fout << S <<'\n';
}
}
}
int main()
{
read();
fin.close();
return 0;
}