5 10 P 1 2 3 P 2 3 4 Q 2 3 Q 1 3 P 3 5 4 P 1 2 7 Q 1 3 Q 3 4 P 5 5 8 Q 1 5 0 0
4 3 4 4 7 4 4 7 8
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define maxn 100010
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std;
struct Node {
int num, col[62];
bool lazy;
} T[maxn << 2];
int a[maxn], b[maxn], c[maxn], hash[maxn << 1];
bool ans[32];
char op[maxn];
void pushDown(int rt) {
T[rt << 1].lazy = T[rt << 1 | 1].lazy = true;
T[rt].lazy = false;
T[rt << 1].col[0] = T[rt << 1 | 1].col[0] = T[rt].col[0];
T[rt << 1].num = T[rt << 1 | 1].num = 1;
}
void pushUp(int rt) {
int count = 0, i;
for(i = 0; i < T[rt << 1].num; ++i)
T[rt].col[count++] = T[rt << 1].col[i];
for(i = 0; i < T[rt << 1 | 1].num; ++i)
T[rt].col[count++] = T[rt << 1 | 1].col[i];
sort(T[rt].col, T[rt].col + count);
T[rt].num = unique(T[rt].col, T[rt].col + count) - T[rt].col;
}
void build(int l, int r, int rt) {
T[rt].lazy = false;
T[rt].num = 1;
T[rt].col[0] = 2;
if(l == r) return;
int mid = (l + r) >> 1;
build(lson);
build(rson);
}
void update(int L, int R, int val, int l, int r, int rt) {
if(L == l && R == r) {
T[rt].lazy = true;
T[rt].num = 1;
T[rt].col[0] = val;
return;
}
if(T[rt].lazy) pushDown(rt);
int mid = (l + r) >> 1;
if(R <= mid) update(L, R, val, lson);
else if(L > mid) update(L, R, val, rson);
else {
update(L, mid, val, lson);
update(mid + 1, R, val, rson);
}
pushUp(rt);
}
void query(int L, int R, int l, int r, int rt) {
if(L == l && R == r) {
for(int i = 0; i < T[rt].num; ++i)
ans[T[rt].col[i]] = true;
return;
}
if(T[rt].lazy) pushDown(rt);
int mid = (l + r) >> 1;
if(R <= mid) query(L, R, lson);
else if(L > mid) query(L, R, rson);
else {
query(L, mid, lson);
query(mid + 1, R, rson);
}
}
int main() {
//freopen("stdin.txt", "r", stdin);
int n, m, i, id, j;
char ch[2];
while(scanf("%d%d", &n, &m) != EOF && (n || m)) {
for(i = id = 0; i < m; ++i) {
scanf("%s%d%d", ch, &a[i], &b[i]);
hash[id++] = a[i];
hash[id++] = b[i];
if(ch[0] == 'P') scanf("%d", &c[i]);
op[i] = ch[0];
}
sort(hash, hash + id);
id = unique(hash, hash + id) - hash;
build(1, id, 1);
for(i = 0; i < m; ++i) {
a[i] = lower_bound(hash, hash + id, a[i]) - hash + 1;
b[i] = lower_bound(hash, hash + id, b[i]) - hash + 1;
if(op[i] == 'P') update(a[i], b[i], c[i], 1, id, 1);
else {
memset(ans, 0, sizeof(ans));
query(a[i], b[i], 1, id, 1);
for(j = 0; j <= 30; ++j)
if(ans[j]) {
printf("%d", j);
break;
}
for(++j; j <= 30; ++j)
if(ans[j]) printf(" %d", j);
printf("\n");
}
}
}
return 0;
}#include <stdio.h>
#include <string.h>
#define maxn 1000002
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
struct Node {
int col;
bool lazy;
} T[maxn << 2];
void pushDown(int rt) {
T[rt].lazy = false;
T[rt << 1].lazy = T[rt << 1 | 1].lazy = true;
T[rt << 1].col = T[rt << 1 | 1].col = T[rt].col;
}
void pushUp(int rt) {
T[rt].col = T[rt << 1].col | T[rt << 1 | 1].col;
}
void build(int l, int r, int rt) {
T[rt].col = 4; // 1 << 2;
T[rt].lazy = false;
if(l == r) return;
int mid = (l + r) >> 1;
build(lson);
build(rson);
}
void update(int L, int R, int col, int l, int r, int rt) {
if(L == l && R == r) {
T[rt].lazy = true;
T[rt].col = 1 << col;
return;
}
if(T[rt].lazy) pushDown(rt);
int mid = (l + r) >> 1;
if(R <= mid) update(L, R, col, lson);
else if(L > mid) update(L, R, col, rson);
else {
update(L, mid, col, lson);
update(mid + 1, R, col, rson);
}
pushUp(rt);
}
int query(int L, int R, int l, int r, int rt) {
if(L == l && R == r) {
return T[rt].col;
}
if(T[rt].lazy) pushDown(rt);
int mid = (l + r) >> 1, ans;
if(R <= mid) ans = query(L, R, lson);
else if(L > mid) ans = query(L, R, rson);
else {
ans = query(L, mid, lson) | query(mid + 1, R, rson);
}
return ans;
}
int main() {
//freopen("stdin.txt", "r", stdin);
int n, m, a, b, c, i, ans;
char ch[2];
while(scanf("%d%d", &n, &m) != EOF && (n || m)) {
build(1, n, 1);
while(m--) {
scanf("%s%d%d", ch, &a, &b);
if(ch[0] == 'P') {
scanf("%d", &c);
update(a, b, c, 1, n, 1);
} else {
ans = query(a, b, 1, n, 1);
for(i = 0; i <= 30; ++i)
if((ans >> i) & 1) {
printf("%d", i);
break;
}
for(++i; i <= 30; ++i)
if((ans >> i) & 1)
printf(" %d", i);
printf("\n");
}
}
}
return 0;
}HDU5023 A Corrupt Mayor's Performance Art 【线段树】
原文:http://blog.csdn.net/chang_mu/article/details/39479669