Cod sursa(job #1871288)

Utilizator ionut98Bejenariu Ionut Daniel ionut98 Data 7 februarie 2017 11:27:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<fstream>
#define inf 1<<30
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,cer,a,b,q;
int tree[400005],lazy[400005],init[400005];
void update(int nod,int a,int b,int i,int j,int val)
{
    if(lazy[nod]!=0)
    {
   		tree[nod]+=lazy[nod];
		if(a!=b)
		{
			lazy[nod*2]+=lazy[nod];
            lazy[nod*2+1]+=lazy[nod];
		}
   		lazy[nod]=0;
  	}
	if(a>b||a>j||b<i)
      return;
  	if(a>=i&&b<=j)
  	{
        tree[nod]+=val;
		if(a!=b)
		{
			lazy[nod*2]+=val;
			lazy[nod*2+1]+=val;
		}
        return;
	}
	update(nod*2,a,(a+b)/2,i,j,val);
	update(1+nod*2,1+(a+b)/2,b,i,j,val);
	tree[nod]=max(tree[nod*2],tree[nod*2+1]);
}
int query(int nod,int a,int b,int i,int j)
{
    if(a>b||a>j||b<i)
      return -inf;
	if(lazy[nod]!=0)
	{
		tree[nod]+=lazy[nod];
		if(a!=b)
		{
			lazy[nod*2]+=lazy[nod];
			lazy[nod*2+1]+=lazy[nod];
		}
		lazy[nod]=0;
	}
	if(a>=i&&b<=j)
      return tree[nod];
	int q1=query(nod*2,a,(a+b)/2,i,j);
	int q2=query(1+nod*2,1+(a+b)/2,b,i,j);
	int res=max(q1,q2);
	return res;
}
int main()
{
    f>>n>>q;
    for(int i=1;i<=n;i++)
    {
        f>>a;
        init[i]=a;
        update(1,1,n,i,i,a);
    }
    while(q--)
    {
        f>>cer>>a>>b;
        if(cer==1)
        {
            update(1,1,n,a,a,b-init[a]);
            init[a]=b;
        }
        else
          g<<query(1,1,n,a,b)<<"\n";
    }
    return 0;
}