Cod sursa(job #2657670)

Utilizator tudorbuhniaTudor Buhnia tudorbuhnia Data 11 octombrie 2020 14:25:51
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
using namespace std;
int ai[100005],v[270000],mx=0;
void up(int st,int dr,int nod,int a,int b,int p)
{
    if(p==0)
    {
        if(b>v[nod])
            v[nod]=b;
    }
    else
    {

    }
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    if(st<=a && a<=mij)
    {
        up(st,mij,nod*2,a,b,p);
    }
    else
    {
        up(mij+1,dr,nod*2+1,a,b,p);
    }
}
void inter(int nod,int st,int dr,int a,int b)
{
    if(st==a && dr==b)
    {
        if(v[nod]>mx)
            mx=v[nod];
        return;
    }
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    int x=0,y=0;
    if(mij+1<=a && a<=dr)
        x=1;
    if(mij+1<=b && b<=dr)
        y=1;
    if(x==0 && y==0)
    {
        inter(nod*2,st,mij,a,b);
    }
    if(x==1 && y==1)
    {
        inter(nod*2+1,mij+1,dr,a,b);
    }
    if(x==0 && y==1)
    {
        inter(nod*2,st,mij,a,mij);
        inter(nod*2+1,mij+1,dr,mij+1,b);
    }
}
int main()
{
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    int n,m,a,b,p;
    cin >> n >> m;
    for(int i=1;i<=n;i++)
    {
        cin >> ai[i];
        up(1,n,1,i,ai[i],0);
    }
    for(int i=1;i<=m;i++)
    {
        cin >> p >> a >> b;
        if(p==0)
        {
            mx=0;
            inter(1,1,n,a,b);
            cout << mx << '\n';
        }
        else
        {
            if(b>ai[a])
                up(1,n,1,a,b,0);
            if(b<ai[a])
                up(1,n,1,a,b,1);
        }
    }
    return 0;
}