Cod sursa(job #1148215)

Utilizator sorynsooSorin Soo sorynsoo Data 20 martie 2014 16:33:14
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
#define inf 9999999
int size,n,m,v[100001],st[401],dr[401],smen[400],i,j,tip,a,b;
void update()
{
    v[a]=b;
    for(int i=1; i*i<=n; i++)
    {
        if(st[i]>=a && dr[i]<=b)
        {
            smen[i]=-1;
            for(int j=st[i]; j<=dr[i]; j++)
                smen[i]=max(smen[i],v[j]);
            break;
        }
    }
}
int interogare()
{
    int ST=inf, DR=-inf,maxim=-inf;
    int i,j;
    for(i=1; i*i<=n; i++)
    {
        if(a<=st[i] && dr[i]<=b)
        {
            if(st[i]<ST)
                ST=st[i];
            if(dr[i]>DR)
                DR=dr[i];
            for(j=st[i]; j<=dr[i]; j++)
                maxim=max(maxim,v[j]);
        }
        if(DR>=b)
            break;
    }
    if(ST==inf && DR==-inf) ST=DR=b;

    for(i=a; i<=ST; i++)
        maxim=max(maxim,v[i]);
    for(i=DR; i<=b; i++)
        maxim=max(maxim,v[i]);
    return maxim;
}
int main()
{
    cin>>n>>m;
    for(i=1; i<=n; i++)
        cin>>v[i];

    while(size*size<=n)
        size++;
    size--;
    for(i=1; i*i<=n; i++) // impart vectorul
    {
        st[i]=size*(i-1)+1; dr[i]=size*i; smen[i]=-1;
        for(j=st[i]; j<=dr[i]; j++)
            smen[i]=max(smen[i],v[j]);
    }
    for(i=1; i<=m; i++) // trec la rezolvare
    {
        cin>>tip>>a>>b;
        if(tip==1)
            update();
        else
            cout<<interogare()<<"\n";
    }
}