社区讨论
线段树求助,根据cmd fc 比较没有差异!!!!
P1531I Hate It参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi865a21
- 此快照首次捕获于
- 2025/11/21 09:15 4 个月前
- 此快照最后确认于
- 2025/11/21 09:15 4 个月前
CPP
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define don(i,a,b) for(register int i=(a);i>=(b);i--)
using namespace std;
const int maxn=1e6+10;
const int maxm=1e3+10;
int root[maxn*4],a[maxn];
int m,n;
template <class t> void read(t &x)
{
x=0;int f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=10*x+ch-'0';ch=getchar();}
x*=f;
}
template <class t> void write(t x)
{
if(x<0) {putchar('-');x=~x+1;}
if(x>9) write(x/10);
putchar(x%10+48);
}
#define lson k<<1
#define rson k<<1|1
/*------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------*/
void pushup(int k)
{
root[k]=max(root[lson],root[rson]);
}
void buildtree(int k,int l,int r)
{
if(l==r) {
root[k]=a[l];
return;
}
int mid=(l+r)/2;
if(l<=mid) buildtree(lson,l,mid);
if(mid<r) buildtree(rson,mid+1,r);
pushup(k);
}
void readdata()
{
read(n),read(m);
rep(i,1,n) read(a[i]);
buildtree(1,1,n);
}
inline ll quary(int l,int r,int x,int y,int k)
{
if(x>r || y<l) return -1;
if(x<=l && y>=r) return root[k];
int mid=(l+r)/2;
return max(quary(l,mid,x,y,lson),quary(mid+1,r,x,y,rson));
}
void change(int l,int r,int x,int v,int k)
{
if(r<x || l>x) return;
if(l==r && l==x) {
root[k]=v;
return;
}
int mid=(l+r)/2;
change(l,mid,x,v,lson);
change(mid+1,r,x,v,rson);
pushup(k);
}
void work()
{
rep(i,1,m) {
char flag;
int x,y;
scanf("%c",&flag);
if(flag=='Q') {
read(x),read(y);
write(quary(1,n,x,y,1));
putchar('\n');
}
if(flag=='U') {
read(x),read(y);
if(a[x]>y) continue;
else change(1,n,x,y,1);
}
}
}
int main()
{
// freopen("input.txt","r",stdin);
// freopen("b.txt","w",stdout);
readdata();
work();
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...