Cod sursa(job #296015)

Utilizator ScrazyRobert Szasz Scrazy Data 3 aprilie 2009 23:13:35
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <cstdio>
#include <algorithm>
#define MaxN 101000
#define BUCKET 256
#define Dim (1<<13)
#define bucket(x) ((x)/BUCKET)
#define first(x) ((x)*BUCKET)

using namespace std;

unsigned n, m, poz;
unsigned val[MaxN], maxBuc[MaxN/BUCKET];

char s[200000], *p;

inline void update(unsigned k, unsigned x){
    	unsigned b = bucket(k); 
	if (val[k]==maxBuc[b])
	{ 
	    maxBuc[b] = val[k] = 0; 
	    for (unsigned i=first(b); i<first(b+1); i++) 
		if (val[i] > maxBuc[b]) maxBuc[b] = val[i]; 
	} 
	val[k] = x;
				
	if (x>maxBuc[b]) maxBuc[b] = x;
}

inline void query(unsigned st, unsigned fn){
    	unsigned b1 = bucket(st), b2 = bucket(fn); 
	unsigned sol = 0; 
	for (unsigned i=b1+1; i<b2; i++) 
	    if (maxBuc[i] > sol) sol = maxBuc[i]; 

	if (sol < maxBuc[b1]) 
	    for (unsigned i=st; i<first(b1+1) && i<=fn; i++) 
		if (val[i] > sol) sol = val[i]; 
	if (sol < maxBuc[b2]) 
	    for (unsigned i=max(first(b2), st); i<=fn; i++) 
		if (val[i] > sol) sol = val[i]; 
	printf("%d\n", sol);
}

inline int get()
{
    int n;
    for (; *p == ' '; p++);

    for (n = 0; *p >= '0' && *p <= '9'; p++)
	n = n * 10 + *p - '0';

    for (; *p == ' '; p++);

    return n;
}

int main(){
    	freopen("arbint.in", "r", stdin); 
	freopen("arbint.out", "w", stdout);
			
	//scanf("%d%d", &n, &m);
	gets(s); p = s; 
	n = get(); 
	m = get();
				
	gets(s); p = s;
	for (unsigned i=0; i<n; i++)
	{ 
	    val[i] = get();
	    if (val[i] > maxBuc[bucket(i)]) maxBuc[bucket(i)] = val[i]; 
	} 
	while (m--)
	{ 
	    unsigned op, a, b; 
	    gets(s); p = s;
	    op = get(); a = get(); b = get();
	    //scanf("%d%d%d", &op, &a, &b);
	    if (op==1) update(a-1, b); 
	    else query(a-1, b-1); 
	}
}