【FOJ】1921 栀子花开

 1 #include<cstdio>

 2 #include<algorithm>

 3 using namespace std;

 4 #define MAXN 10010

 5 int tree[MAXN<<2],ca=1;

 6 inline void PushUp(int rt)

 7 {

 8     tree[rt]=min(tree[rt<<1],tree[rt<<1|1]);

 9 }

10 void Build(int L,int R,int rt)

11 {

12     if(L==R)

13         scanf("%d",&tree[rt]);

14     else

15     {

16         int mid=(L+R)>>1;

17         Build(L,mid,rt<<1);

18         Build(mid+1,R,rt<<1|1);

19         PushUp(rt);

20     }

21 }

22 void Add(int x,int val,int L,int R,int rt)

23 {

24     if(L==R)

25         tree[rt]+=val;

26     else

27     {

28         int mid=(L+R)>>1;

29         if(x<=mid)

30             Add(x,val,L,mid,rt<<1);

31         else

32             Add(x,val,mid+1,R,rt<<1|1);

33         PushUp(rt);

34     }

35 }

36 void Update(int val,int L,int R,int rt)

37 {

38     if(L==R)

39         tree[rt]+=val;

40     else

41     {

42         int mid=(L+R)>>1;

43         if(tree[rt]==tree[rt<<1])

44             Update(val,L,mid,rt<<1);

45         else

46             Update(val,mid+1,R,rt<<1|1);

47         PushUp(rt);

48     }

49 }

50 void Query(int L,int R,int rt)

51 {

52     if(L==R)

53         printf("Case %d: %d %d\n",ca++,L,tree[rt]);

54     else

55     {

56         int mid=(L+R)>>1;

57         if(tree[rt]==tree[rt<<1])

58             Query(L,mid,rt<<1);

59         else

60             Query(mid+1,R,rt<<1|1);

61     }

62 }

63 int main()

64 {

65     int n,t,q,a,b;

66     scanf("%d",&t);

67     while(t--)

68     {

69         scanf("%d",&n);

70         Build(1,n,1);

71         scanf("%d",&q);

72         while(q--)

73         {

74             scanf("%d%d",&a,&b);

75             if(a)

76                 Add(a,b,1,n,1);

77             else

78                 Update(b,1,n,1);

79         }

80         Query(1,n,1);

81     }

82     return 0;

83 }

你可能感兴趣的:(OJ)