Cod sursa(job #2419621)

Utilizator TudorChirila11Tudor Chirila TudorChirila11 Data 8 mai 2019 22:55:43
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.29 kb

#include <fstream>
#define mult 2000000000
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, i, j, p, x, c, b, a, ans;
pair<int,int> v[300005];
int val[300005], q;
bool viz[300005];
void upgrade(int nod, int poz)
{
    if(v[nod].first==poz&&v[nod].second==poz)
        val[nod]=x;
    else if(v[nod].first<=poz&&v[nod].second>=poz)
    {
        upgrade(2*nod,poz);
        upgrade(2*nod+1,poz);
        val[nod]=max(val[2*nod],val[2*nod+1]);
    }
}
void calculeaza(int nod, int l, int r)
{
    if (v[nod].first>=l&&v[nod].second<=r)ans=max(ans,val[nod]);
    else if((v[nod].first<=l&&v[nod].second>=r)||(v[nod].first>=l&&v[nod].first<=r&&v[nod].second>r)||(v[nod].second<=r&&v[nod].second>=l&&v[nod].first<l))
    {
        calculeaza(nod*2,l,r);
        calculeaza(nod*2+1,l,r);
    }
}
void fa_perechi(int nod)
{
    if(val[nod]==0)
    {
    //    fout<<nod<<'\n';
        if(viz[2*nod]!=0&&viz[2*nod+1]!=0)
        {
            val[nod]=max(val[nod*2],val[2*nod+1]);
            v[nod].first=min(v[nod*2].first,v[nod*2+1].first);
            v[nod].second=max(v[nod*2].second,v[nod*2+1].second);
        }
        else
        {
            fa_perechi(2*nod);
            fa_perechi(2*nod+1);
            val[nod]=max(val[nod*2],val[2*nod+1]);
            v[nod].first=min(v[nod*2].first,v[nod*2+1].first);
            v[nod].second=max(v[nod*2].second,v[nod*2+1].second);
        }
    }
}
int main()
{
    fin>>n>>q;
    p=1;
    while(p<n)
        p*=2;
  //  p/=2;
    for(i=p;i<=p+n-1;i++)
        {
            fin>>val[i];
            viz[i]=1;
            v[i].first=v[i].second=i-p+1;
        }
    for(i=p+n;i<=p*2;i++)
 {
     val[i]=-1,v[i].first=v[i].second=i-p+1;
        viz[i]=1;
}
    fa_perechi(1);
    //fout<<p<<'\n';
    for(i=1;i<=q;i++)
    {
        fin>>c>>a>>b;
        if(c==0)
        {
            ans=-1;
            calculeaza(1,a,b);
            fout<<ans<<'\n';
        }
        else
        {
            x=b;
            upgrade(1,a);
      //      for(j=1;j<=p+n-1;j++)
        //        fout<<val[j]<<' ';
          //  fout<<'\n';
        }
    }
    //for(i=1;i<=p*2;i++)
      //  fout<<i<<' '<<val[i]<<' '<<v[i].first<<' '<<v[i].second<<'\n';
    return 0;
}