Cod sursa(job #2052954)

Utilizator patcasrarespatcas rares danut patcasrares Data 31 octombrie 2017 11:26:39
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.46 kb
#include<fstream>
#include<iostream>
#include<vector>
#define DN 200005
#define x first
#define y second
#include<queue>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int a[DN],pr[DN],n,m,y,c[DN],nod,mij,r[DN];
pair<int,int>x[DN];
vector<int>v[DN];
queue<int >q;
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>a[i];
    y=1;
    x[1].x=1;
    x[1].y=n;
    q.push(1);
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        if(x[nod].x!=x[nod].y)
        {
            mij=(x[nod].x+x[nod].y)/2;
            y++;
            x[y].x=x[nod].x;
            x[y].y=mij;
            pr[y]=nod;
            q.push(y);
            v[nod].push_back(y);
            y++;
            x[y].x=mij+1;
            x[y].y=x[nod].y;
            pr[y]=nod;
            q.push(y);
            v[nod].push_back(y);
        }
        else
            c[x[nod].x]=nod;
    }
    for(int i=1;i<=n;i++)
    {
        nod=c[i];
        r[nod]=a[i];
    }
    for(int i=1;i<=n;i++)
    {
        nod=c[i];
        int t=r[nod];
        while(pr[nod])
        {
            nod=pr[nod];
            r[nod]=-1;
            for(int j=0;j<v[nod].size();j++)
                r[nod]=max(r[nod],r[v[nod][j]]);
            if(r[nod]!=t)
                break;
        }
    }
   // for(int i=1;i<=y;i++)
   //     cout<<x[i].x<<' '<<x[i].y<<' '<<r[i]<<'\n';
    int type,f,g;
    for(int i=1;i<=m;i++)
    {
        fin>>type>>f>>g;
        if(type==1)
        {
            a[f]=g;
            nod=c[f];
            r[nod]=a[f];
            int t=r[nod];
            while(pr[nod])
            {
                nod=pr[nod];
                r[nod]=-1;
                for(int j=0;j<v[nod].size();j++)
                    r[nod]=max(r[nod],r[v[nod][j]]);
                if(r[nod]!=t)
                    break;
            }
        }
        else
        {
            int poz=f,ma=-1,ye;
            while(poz<=g)
            {
                ye=c[poz];
                while(1)
                {
                    if(!pr[ye])
                        break;
                    if(x[pr[ye]].x<f||x[pr[ye]].y>g)
                        break;
                    ye=pr[ye];//cout<<x[ye].x<<' '<<x[ye].y<<' '<<pr[ye]<<'\n';
                }

                ma=max(ma,r[ye]);
                poz=x[ye].y+1;
            }
            fout<<ma<<'\n';
        }
    }
}