Cod sursa(job #1034276)

Utilizator enedumitruene dumitru enedumitru Data 17 noiembrie 2013 19:06:17
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#define dim 100001
using namespace std;
ifstream f("arbint.in"); ofstream g("arbint.out");
int N,M,X,Y,tip,size,K;
int  A[dim],Arb[dim],St[dim],Dr[dim];
inline int Maxim(int a, int b) {return a>b ? a : b;}
void Update()
{    A[X]=Y;
     for(int i=1; i*size<=N; i++)
		if(St[i]<=X && X<=Dr[i])
		{   Arb[i]=-1;
			for(int j=St[i]; j<=Dr[i]; j++) Arb[i]=Maxim(Arb[i],A[j]);
			break;
		}
}
int Query()
{   int maxim = -1;
    int st=(1<<30), dr=-1;
    for(int i=1; i<=K; i++)
    {   if(X<=St[i] && Dr[i]<=Y)
        {   if(St[i]<st) st=St[i];
			if(dr<Dr[i]) dr=Dr[i];
			maxim = Maxim(maxim,Arb[i]); 
        }
        if(Y<Dr[i]) break;
    }
    if(st==(1<<30) && dr==-1) st=dr=Y;
    for(int i=X; i<=st; i++) maxim=Maxim(maxim,A[i]);
    for(int i=dr; i<=Y; i++) maxim = Maxim(maxim,A[i]);
    return maxim;
}
int main()
{	f>>N>>M;
    for(int i=1;i<=N;i++) f>>A[i];
    size=0;
    while(size*size<=N) size++;
    size--;
    K=N/size;
    for(int i=1; i*size<=N; i++) 
    {   Arb[i]=-1;
        St[i]=size*(i-1)+1, Dr[i]=size*i;
        for(int j=St[i]; j<=Dr[i]; j++) Arb[i]=Maxim(Arb[i],A[j]);
    }
    while(M--)
    {   f>>tip>>X>>Y;
        if(tip) Update(); else g<<Query()<<'\n';
    }
}