标签:最大 i++ name 个数 == while 序列 include mes
给定一个包含n个数的序列,初值全为0,现对这个序列有两种操作:
操作1:把 给定 第k1 个数改为k2;
操作2:查询 从第k1个数到第k2个数得最大值。(k1<=k2<=n)
n<=100000;所有的数<=100000;
由于这里的n过大所以构造线段树。
1 #include<iostream> 2 #include<cmath> 3 #include<ctime> 4 #include<cstdio> 5 #include<cstring> 6 #include<string> 7 #include<algorithm> 8 #include<map> 9 #include<vector> 10 #include<iomanip> 11 #include<queue> 12 #include<stack> 13 using namespace std; 14 inline int read() 15 { 16 int x=0,f=1;char ch=getchar(); 17 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 18 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 19 return x*f; 20 } 21 struct segment 22 { 23 int l,r; 24 int v; 25 }t[400009]; 26 void build(int p,int l,int r) 27 { 28 t[p].l=l;t[p].r=r; 29 if(l==r){t[p].v=0;return;} 30 int mid=(l+r)/2; 31 build(p*2,l,mid); 32 build(p*2+1,mid+1,r); 33 t[p].v=max(t[p*2].v,t[p*2+1].v); 34 } 35 void change(int p,int x,int v) 36 { 37 if(t[p].l==t[p].r){t[p].v=v;return;} 38 int mid=(t[p].l+t[p].r)/2; 39 if(x<=mid)change(p*2,x,v); 40 else change(p*2+1,x,v); 41 t[p].v=max(t[p*2].v,t[p*2+1].v); 42 } 43 int ask(int p,int l,int r) 44 { 45 if(l<=t[p].l&&r>=t[p].r) return t[p].v; 46 int mid=(t[p].l+t[p].r)/2; 47 int val=-100000; 48 if(l<=mid)val=max(val,ask(p*2,l,r)); 49 if(r>mid)val=max(val,ask(p*2+1,l,r)); 50 return val; 51 } 52 int n; 53 int main() 54 { 55 freopen("1.in","r",stdin); 56 n=read(); 57 build(1,1,n); 58 for(int i=1;i<=n;i++) 59 { 60 int x,y,z; 61 x=read();y=read();z=read(); 62 if(x==1) 63 { 64 change(1,y,z); 65 } 66 if(x==2) 67 { 68 int u=ask(1,y,z); 69 printf("%d\n",u); 70 } 71 } 72 return 0; 73 }
oj p1243
标签:最大 i++ name 个数 == while 序列 include mes
原文地址:https://www.cnblogs.com/chdy/p/9614269.html