AC14个RE30个,求调
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int tree[4 * N], a[N], n, m, t, x, y, tot, s[N];
void build(int l, int r, int id)
{
if (l == r)
{
tree[id] = a[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, id * 2);
build(mid + 1, r, id * 2 + 1);
tree[id] = min(tree[id * 2], tree[id * 2 + 1]);
return;
}
void change(int l, int r, int id)
{
if (l == r)
{
tree[id] = y;
return;
}
int mid = (l + r) >> 1;
if (l <= x and x <= mid)
change(l, mid, id * 2);
if (mid < x and x <= r)
change(mid + 1, r, id * 2 + 1);
tree[id] = min(tree[id * 2], tree[id * 2 + 1]);
return;
}
int mn(int l, int r, int id)
{
if (l > y or r < x)
return INT_MAX;
if (l == x and r == y)
return tree[id];
int mid = (l + r) >> 1;
return min(mn(l, mid, id * 2), mn(mid + 1, r, id * 2 + 1));
}
void fnd(int l, int r, int id, int v)
{
if (l == r)
{
if (tree[id] == v and x <= l and l <= y)
s[++tot] = l;
return;
}
int mid = (l + r) >> 1;
if (x <= l && r <= y)
{
if(tree[id * 2] == v)
fnd(l, mid, id * 2, v);
if(tree[id * 2 + 1] == v)
fnd(mid + 1, r, id * 2 + 1, v);
return;
}
if (l <= x and x <= mid)
fnd(l, mid, id * 2, v);
if (mid < y and y <= r)
fnd(mid + 1, r, id * 2 + 1, v);
return;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie();
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
build(1, n, 1);
for (int i = 1; i <= m; i++)
{
cin >> t >> x >> y;
if (t == 1)
change(1, n, 1);
else
{
int v = mn(1, n, 1);
fnd(1, n, 1, v);
cout << tot << " ";
for (int i = 1; i <= tot; i++)
cout << s[i] << " ";
cout << endl;
tot = 0;
}
}
return 0;
}