Cod sursa(job #1069520)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 30 decembrie 2013 10:31:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;

#define Dim (1<<13)
#define nmax 100001
#define bucket_dim 320
  
int i, j, poz, N, M;
int op, a, b, st, dr;
int v[nmax];
  
int cnt, pos_a, pos_b, dim, buckets;
int bucket[bucket_dim];
int I[bucket_dim];

char lin[Dim];
 
inline void cit(int &x){
    x=0;
    while (lin[poz]<'0' || lin[poz]>'9'){
          poz++;
          if (poz == Dim) fread(lin, 1, Dim, stdin), poz=0;   
    }
    while (lin[poz]>='0' && lin[poz]<='9'){
        x = 10*x+lin[poz++]-'0';     
        if (poz == Dim) fread(lin, 1, Dim, stdin), poz=0; 
    }            
}

inline void update(int a, int b) {
	--a;
	cnt = a / dim;
	if (bucket[cnt] == v[a + 1]) {
		v[a + 1] = bucket[cnt] = 0;
		for (int k = 0, j = I[cnt]; k < dim; ++k, ++j) bucket[cnt] = max(bucket[cnt], v[j]);
	}
	v[a + 1] = b;
	if (bucket[cnt] < b) bucket[cnt] = b;
}

inline void query(int a, int b) {
	--a;
	--b;
	int t1, t2, vmax = 0, j;
	t1 = a / dim;
	t2 = b / dim;
	pos_a = a % dim;
	pos_b = b % dim;
	if (t1 != t2) {
		++t1;
		--t2;
		for (; t1 <= t2; ++t1)
			vmax = max(vmax, bucket[t1]);
		if (vmax < bucket[(a / dim)])
			for (j = a + 1, cnt = pos_a; cnt <= dim; ++cnt, ++j) vmax = max(vmax, v[j]);
		if (vmax < bucket[(b / dim)])
			for (j = b + 1, cnt = pos_b; cnt >= 0; --cnt, --j) vmax = max(vmax, v[j]);
	}
	else {
		for (j = a + 1, cnt = pos_a; cnt <= pos_b; ++cnt, ++j)
			vmax = max(vmax, v[j]);
	}
	printf("%i\n", vmax);
}

int main() {
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
    cit(N); cit(M);
    dim = sqrt(1.0 * N);
    I[0] = 1;
    for (i = 1; i <= N; ++i, ++j) {
        cit(v[i]);
        if (j == dim) {
            ++cnt, j = 0;
            I[cnt] = i;
        }
        bucket[cnt] = max(bucket[cnt], v[i]);
    }
    for (i = 1; i <= M; ++i) {
		cit(op); cit(a); cit(b);
        if (op) update(a, b);
        else 
			query(a, b);
    }
    return 0;
}