Cod sursa(job #749599)

Utilizator gabrielvGabriel Vanca gabrielv Data 17 mai 2012 19:25:17
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include<cstdio>
#define NMAX 400500
#define NMAX2 1000015
#define maxim(a,b) ((a>b)?(a):(b))

using namespace std;

int SegT[NMAX];
char line[NMAX2];
int Sol,A,B,N,k,M,begin,op;

inline int left_son(int nod)
{
    return nod<<1;
}
inline int right_son(int nod)
{
    return (nod<<1)+1;
}
void update(int nod, int left, int right)
{
     if(left==right)
     {
            SegT[nod]=B;
            return;
     }
     int mid;
     mid=left+(right-left)/2;
     if(A<=mid)
        update(left_son(nod),left,mid);
    else
        update(right_son(nod),mid+1,right);
	SegT[nod]=maxim(SegT[left_son(nod)],SegT[right_son(nod)]);
}
void query(int nod, int left, int right)
{
    if(A<=left && right<=B)
     {
            Sol=maxim(Sol,SegT[nod]);
            return;
     }
     int mid;
     mid=left+(right-left)/2;
     if(A<=mid)
        query(left_son(nod),left,mid);
    if(B>mid)
        query(right_son(nod),mid+1,right);
}
bool digit(char chs)
{
	if('0'<=chs && chs<='9')
		return true;
	return false;
}
int compute(int &n)
{
	n=0;
	for(;digit(line[begin]);begin++)
		n=n*10+int(line[begin]-'0');
	begin++;
	return n;
}
void citire_SegT()
{
	fgets(line+1,NMAX2-5,stdin);
	begin=1;
	compute(N);
	compute(M);
	fgets(line+1,NMAX2-5,stdin);
	begin=1;
	for(k=1;k<=N;k++)
    {
		compute(B);
        A=k;
        update(1,1,N);
    }
}
void citire_Query()
{
	fgets(line+1,NMAX2-5,stdin);
	begin=1;
	compute(op);
	compute(A);
	compute(B);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    //scanf("%d %d",&N,&M);
	citire_SegT();
    while(M--)
    {
        citire_Query();
        if(op==0)
        {
            Sol=-1;
            query(1,1,N);
            printf("%d\n",Sol);
        }
        else
            update(1,1,N);
    }
    return 0;
}